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,验证登陆是否失效的更多相关文章

  1. Django 利用JWT实现前后端分离的Token验证

    一.什么是Token? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器会生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请 ...

  2. 前后端分离使用 Token 登录解决方案

    前后端分离使用 Token 登录解决方案:https://juejin.im/post/5b7ea1366fb9a01a0b319612

  3. SpringBoot20 集成SpringSecurity02 -> 利用SpringSecurity进行前后端分离的登录验证

    1 SpirngBoot环境搭建 创建一个SpringBoot项目即可,详情参见三少的相关博文 参考博文 -> 点击前往 SpirngBoot项目脚手架 -> 点击前往 2 引入Spirn ...

  4. 【笔记】vue+springboot前后端分离实现token登录验证和状态保存的简单实现方案

    简单实现 token可用于登录验证和权限管理. 大致步骤分为: 前端登录,post用户名和密码到后端. 后端验证用户名和密码,若通过,生成一个token返回给前端. 前端拿到token用vuex和lo ...

  5. 前后端分离——token超时刷新策略

    前言 记录一下前后端分离下————token超时刷新策略! 需求场景 昨天发了一篇记录 前后端分离应用——用户信息传递 中介绍了token认证机制,跟几位群友讨论了下,有些同学有这么一个疑惑:toke ...

  6. Cookie、Session、Token那点事儿和前后端分离之JWT用户认证

    (两篇文章转自:https://www.jianshu.com/p/bd1be47a16c1:https://www.jianshu.com/p/180a870a308a) 什么是Cookie? Co ...

  7. 【手摸手,带你搭建前后端分离商城系统】03 整合Spring Security token 实现方案,完成主业务登录

    [手摸手,带你搭建前后端分离商城系统]03 整合Spring Security token 实现方案,完成主业务登录 上节里面,我们已经将基本的前端 VUE + Element UI 整合到了一起.并 ...

  8. 前后端分离中的无痛刷新token机制

    今天我们来说一说前后端分离中的无痛刷新token机制 博主先来分享一波福利,最近挖到的宝藏,刚开始学Java的同学看 https://www.bilibili.com/video/BV1Rx41187 ...

  9. laravel5.7 前后端分离开发 实现基于API请求的token认证

    最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的.因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离 ...

  10. Session与Token认证机制 前后端分离下如何登录

     字号 1 Web登录涉及到知识点 1.1 HTTP无状态性 HTTP是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的 ...

随机推荐

  1. 微信小程序的视图与渲染

    1.组件的基本使用 <button type="default" > default </button> <button type="pri ...

  2. 【Java例题】2.1复数类

    1.定义复数类,包括实部和虚部变量.构造方法. 加减乘除方法.求绝对值方法和显示实部.虚部值的方法. 然后编写一个主类,在其主方法中通过定义两个复数对象来 显示每一个复数的实部值.虚部值和绝对值, 显 ...

  3. ArrayList 的使用方法【摘要】

    ArrayList 的使用方法 1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: (1)动态的增加和减少元素 ...

  4. 201312-2ISBN号码

    问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位 ...

  5. 统计学习方法—SVM推导

    目录 SVM 1. 定义 1.1 函数间隔和几何间隔 1.2 间隔最大化 2. 线性可分SVM 2.1 对偶问题 2.2 序列最小最优算法(SMO) 3. 线性不可分SVM 3.1 松弛变量 3.2 ...

  6. UML类图(1.3)

    UML:Unified modeling Language 统一建模语言 UML类图:用来描述系统所包含的类以及类之间的关系. 画图工具:https://www.processon.com 类之间的6 ...

  7. 二、java实现多线程的方式?

    一.同步?异步? 下面两幅图解释了同步异步. 二.实现多线程的方式 1.继承Thread package threaddemo; class CreateThreadDemo extends Thre ...

  8. react-navigation报错

    用react-navigation配置路由时,出现如下报错或白屏. 我的代码原来是 import {AppRegistry} from 'react-native'; import App from ...

  9. 浅谈 JavaScript 垃圾回收机制

    github 获取更多资源 https://github.com/ChenMingK/WebKnowledges-Notes 在线阅读:https://www.kancloud.cn/chenmk/w ...

  10. .net软件开发脚本规范-SQL脚本标准

    一. SQL脚本标准 各文件夹存放的脚本说明 存储过程:除“基础_”开头的所有存储过程,包含新增.修改.删除.列表.提交.审核. 基础数据:“基础_”开头的存储过程,用于下拉列表的数据加载公共方法. ...