前后端分离,获取token,验证登陆是否失效
maven依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>2.2.0</version>
</dependency>
public class JwtUtils {
/**
* 密钥
*/
private static final String SECRET="xxxx";
/**
* 默认字段key:exp
*/
private static final String EXP="exp";
/**
* 默认字段key:payload
*/
private static final String PAYLOAD="payload";
/**
* 加密
* @param object 加密数据
* @param maxTime 有效期(毫秒数)
* @param <T>
* @return
*/
public static <T> String encode(T object,long maxTime){
try{
final JWTSigner signer=new JWTSigner(SECRET);
final Map<String ,Object> data=new HashMap<>(10);
ObjectMapper objectMapper=new ObjectMapper();
String jsonString=objectMapper.writeValueAsString(object);
data.put(PAYLOAD,jsonString);
data.put(EXP,System.currentTimeMillis()+maxTime);
return signer.sign(data);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 数据解密
* @param jwt 解密数据
* @param tClass 解密类型
* @param <T>
* @return
*/
public static <T> T decode(String jwt,Class<T> tClass) {
final JWTVerifier jwtVerifier = new JWTVerifier(SECRET);
try {
final Map<String, Object> data = jwtVerifier.verify(jwt);
//判断数据是否超时或者符合标准
if (data.containsKey(EXP) && data.containsKey(PAYLOAD)) {
long exp = (long) data.get(EXP);
long currentTimeMillis = System.currentTimeMillis();
if (exp > currentTimeMillis) {
String json = (String) data.get(PAYLOAD);
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(json, tClass);
}
}
return null;
} catch (Exception e) {
//e.printStackTrace();
return null;
}
}
//解密token取出userId
public static <T> T updateDecode(String jwt,Class<T> tClass){
final JWTVerifier jwtVerifier = new JWTVerifier(SECRET);
try {
final Map<String, Object> data = jwtVerifier.verify(jwt);
String json = (String) data.get(PAYLOAD);
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(json, tClass);
} catch (Exception e) {
//e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws InterruptedException {
// 有效期10秒
// 加密:
// TestCenterAdministratorsVO test = new TestCenterAdministratorsVO();
// test.setId(1L);
// test.setLoginName("sa");
// String token=encode(test,1000000);
// System.out.println("TOKEN======="+token);
// //Thread.sleep(10000);
//// 解密
// TestCenterAdministratorsVO user=decode(token,TestCenterAdministratorsVO.class);
// System.out.println(user.getId()+user.getLoginName());
//removeDecode("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDcwODkwNTYxNDgsInBheWxvYWQiOiJ7XCJpZFwiOjEsXCJuYW1lXCI6bnVsbCxcInBob25lTnVtYmVyXCI6bnVsbCxcImxvZ2luTmFtZVwiOlwic2FcIixcInNlcmlhbE51bWJlclwiOm51bGwsXCJ0eXBlXCI6bnVsbCxcInRlc3RDZW50ZXJJZFwiOm51bGwsXCJvcmdhbml6YXRpb25JZFwiOm51bGwsXCJtYWluU2l0ZUFkbWluXCI6ZmFsc2UsXCJhZG1pblwiOmZhbHNlLFwib3JnYW5pemF0aW9uTmFtZVwiOm51bGx9In0.FgYm4wSDhkZukqlRukjwvxQ1BM746AWQfCmGucMP3pc");
updateDecode("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDcwMTgxNTU4OTYsInBheWxvYWQiOiJ7XCJpZFwiOjIwMTAwMDAzMyxcIm5hbWVcIjpcIuW6numTtuaYjFwiLFwicGhvbmVOdW1iZXJcIjpudWxsLFwibG9naW5OYW1lXCI6XCJwYW5neWluY2hhbmdcIixcInNlcmlhbE51bWJlclwiOm51bGwsXCJ0eXBlXCI6XCJNQUlOU0lURUFETUlOXCIsXCJ0ZXN0Q2VudGVySWRcIjo3OSxcIm9yZ2FuaXphdGlvbklkXCI6XCIwMDFcIixcIm1haW5TaXRlQWRtaW5cIjp0cnVlLFwiYWRtaW5cIjpmYWxzZSxcIm9yZ2FuaXphdGlvbk5hbWVcIjpudWxsfSJ9.yrYlU4djPPQyu1mneQgkVgLCEQiJ2pKkyX8EVw0NcY8",TestCenterAdministratorsVO.class);
}
}
跨域设置拦截器
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.RequestMethod; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Created with IDEA
* author:QinWei
* Date:2019/1/8
* Time:16:15
*/
public class AjaxFilter implements Filter { @Override
public void destroy() { } @Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//禁止首页访问
String url = request.getRequestURI();
if("/".equals(url)){
return;
}
// 指定允许其他域名访问
response.setHeader("Access-Control-Allow-Origin", "*");
// 响应类型
response.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, OPTIONS, DELETE");
// 响应头设置
response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header, HaiYi-Access-Token");
chain.doFilter(req, res);
} @Override
public void init(FilterConfig arg0) throws ServletException {
}
}
web.xml
<filter>
<filter-name>ajaxFilter</filter-name>
<filter-class>*.*.*.web.servlet.barcode.AjaxFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ajaxFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截token过滤器,包含获取spring--bean手动注入
response .setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String actionName = context.getActionInvocation().getProxy().getActionName();
String url = request.getRequestURI();
ServletContext application = ServletActionContext.getServletContext();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);
this.testCenterService = (TestCenterService)ctx.getBean("testCenterService");
if(!url.equals("/login")){
//悠闲判断是否为空或者时间是否失效
String token = request.getParameter("token");
TestCenterAdministratorsVO user = JwtUtils.decode(token, TestCenterAdministratorsVO.class);
if(null==token||"".equals(token)||null==user){
out.print(Message.error(0,"token不合法!"));
return null;
}else{
try {
//再次判断数据库状态
TestCenterAdministratorsVO users = JwtUtils.updateDecode(token, TestCenterAdministratorsVO.class);
String tokens = testCenterService.scheckToken(token,users.getId());
if(null==tokens){
out.print(Message.error(0,"token不合法!"));
return null;
}
}catch (Exception e){
out.print(Message.error());
return null;
}
}
}
加群:687942640
微信扫描公众号

前后端分离,获取token,验证登陆是否失效的更多相关文章
- Django 利用JWT实现前后端分离的Token验证
一.什么是Token? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器会生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请 ...
- 前后端分离使用 Token 登录解决方案
前后端分离使用 Token 登录解决方案:https://juejin.im/post/5b7ea1366fb9a01a0b319612
- SpringBoot20 集成SpringSecurity02 -> 利用SpringSecurity进行前后端分离的登录验证
1 SpirngBoot环境搭建 创建一个SpringBoot项目即可,详情参见三少的相关博文 参考博文 -> 点击前往 SpirngBoot项目脚手架 -> 点击前往 2 引入Spirn ...
- 【笔记】vue+springboot前后端分离实现token登录验证和状态保存的简单实现方案
简单实现 token可用于登录验证和权限管理. 大致步骤分为: 前端登录,post用户名和密码到后端. 后端验证用户名和密码,若通过,生成一个token返回给前端. 前端拿到token用vuex和lo ...
- 前后端分离——token超时刷新策略
前言 记录一下前后端分离下————token超时刷新策略! 需求场景 昨天发了一篇记录 前后端分离应用——用户信息传递 中介绍了token认证机制,跟几位群友讨论了下,有些同学有这么一个疑惑:toke ...
- Cookie、Session、Token那点事儿和前后端分离之JWT用户认证
(两篇文章转自:https://www.jianshu.com/p/bd1be47a16c1:https://www.jianshu.com/p/180a870a308a) 什么是Cookie? Co ...
- 【手摸手,带你搭建前后端分离商城系统】03 整合Spring Security token 实现方案,完成主业务登录
[手摸手,带你搭建前后端分离商城系统]03 整合Spring Security token 实现方案,完成主业务登录 上节里面,我们已经将基本的前端 VUE + Element UI 整合到了一起.并 ...
- 前后端分离中的无痛刷新token机制
今天我们来说一说前后端分离中的无痛刷新token机制 博主先来分享一波福利,最近挖到的宝藏,刚开始学Java的同学看 https://www.bilibili.com/video/BV1Rx41187 ...
- laravel5.7 前后端分离开发 实现基于API请求的token认证
最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的.因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离 ...
- Session与Token认证机制 前后端分离下如何登录
字号 1 Web登录涉及到知识点 1.1 HTTP无状态性 HTTP是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的 ...
随机推荐
- java并发程序和共享对象实用策略
java并发程序和共享对象实用策略 在并发程序中使用和共享对象时,可以使用一些实用的策略,包括: 线程封闭 只读共享.共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它.共享的只读对象包括不 ...
- 简单聊聊红黑树(Red Black Tree)
前言 众所周知,红黑树是非常经典,也很非常重要的数据结构,自从1972年被发明以来,因为其稳定高效的特性,40多年的时间里,红黑树一直应用在许多系统组件和基础类库中,默默无闻的为我们提供服务,身边 ...
- SonarQube+Jenkins安装工程中遇到的吭
1. SonarQube是不是有点飘了,居然要java11+才能运行 解决方案: 重新下载老版本 也不知道哪个版本才好用,就下载了7.0 和6.6,这两个版本用jdk1.8就可以用 2. 配置数据库u ...
- DesignPattern系列__06迪米特原则
迪米特原则定义 迪米特原则,也叫最少知道原则,即一个类应该对自己依赖的类知道的越少越好,而你被依赖的类多么复杂,对我都没有关系.也就是说,对于别依赖的类来说,不管业务逻辑多么复杂,都应该尽量封装在类的 ...
- 【Java笔记】【Java核心技术卷1】chapter3 D3数据类型
package chapter3; public class D3数据类型 { public static void main(String[] arg) { //Java 整型(字节数不会随硬件变化 ...
- kpm字符串匹配算法
首先是简单的朴素匹配算法 /* * 返回子串t在主串s的位置,若不存在则返回0 */ public static int index(String s, String t) { int i = 0;/ ...
- Nginx 502 Bad Gateway 错误的解决方法
502 bad gateway 的解决方法 通用配置 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; # ...
- N*N矩阵的旋转 不开辟新空间
/* N*N矩阵的旋转 不开辟新空间 programmer:qpz time:2014-11-09 */ #include <iostream> using namespace std; ...
- 二分查找法---scala方式
二分查找法---scala方式 ,b) } }
- python 29 Socket - 套接字
目录 Socket - 套接字 Socket - 套接字 应用层与TCP/IP协议族通信层(或传输层)之间的抽象层,是一组接口()接收数据:当接口接收数据之后,交由操作系统: 如果数据与操作系统直接交 ...