JWT+拦截器实现简单登陆验证
时间:2019-08-10
本文章向大家介绍JWT+拦截器实现简单登陆验证,主要包括JWT+拦截器实现简单登陆验证使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.增加JWT依赖
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.8.1</version> </dependency>
2.JWT工具类
public class TokenUtil { //token 密钥 private static final String TOKEN_SECRET = "27f56a1ca0a347618ff39c7fdf9ab684"; //15分钟超时时间 private static final long OUT_TIME = 150 * 60 * 1000; private static Logger log = LoggerFactory.getLogger(TokenUtil.class); /** 加密 * @param userId * @return */ public static String sign(String userId) { try { Date expiration_time = new Date(System.currentTimeMillis() + OUT_TIME); Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); Map<String, Object> headerMap = new HashMap<>(2); headerMap.put("type", "JWT"); headerMap.put("alg", "HS256"); return JWT.create().withHeader(headerMap).withClaim("userId", userId).withExpiresAt(expiration_time).sign(algorithm); } catch (Exception e) { log.error(e.getMessage()); return null; } } /** 解密 * @param token * @return */ public static Map<String, Claim> verifyToken(String token) { DecodedJWT decodedJWT=null; try { JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).build(); decodedJWT = verifier.verify(token); log.info("超时时间:"+decodedJWT.getExpiresAt()); log.info("载体信息:"+decodedJWT.getClaim("userId").asString()); log.info("算法:"+decodedJWT.getAlgorithm()); }catch (Exception e){ //解码异常则抛出异常 log.error(e.getMessage()); return null; } return decodedJWT.getClaims(); } }
3.使用拦截器拦截请求,以及springboot注入拦截器
@Component public class TokenInterceptor implements HandlerInterceptor { private Logger logger = LoggerFactory.getLogger(TokenInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); //token验证 if (!StringEmpty.IsEmpty(token)) { Map<String, Claim> claimMap = TokenUtil.verifyToken(token); if (claimMap!=null){ //账户操作... return true; } else { //验证错误,跳转到错误页面 response.sendRedirect(request.getContextPath()+"/twjd/error"); return false; } } return false; } }
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistration registration = registry.addInterceptor(tokenInterceptor); //拦截配置 registration.addPathPatterns("/twjd/**"); //排除配置 registration.excludePathPatterns("/twjd/login","/twjd/error"); } }
4.用户登陆操作,验证用户是否携带token,如果携带token则验证
/** * 用户登陆 * * @param sysusers * @param request * @param response * @return */ @RequestMapping(value = "/login", method = RequestMethod.POST) @ResponseBody public HashMap<String, String> login(Sysuser sysusers, HttpServletRequest request, HttpServletResponse response) { Sysuser user = logService.getUser(sysusers.getName()); HashMap<String, String> tokenMap = new HashMap<>(1); //用户存且密码正确在则颁发token if (null != user && user.getPassword().equals(sysusers.getPassword())) { if (!StringEmpty.IsEmpty(user.getPassword())) { response.setHeader("token", TokenUtil.sign(user.getID())); tokenMap.put("token", TokenUtil.sign(user.getID())); //存入redis中设置过期时间1天 if (!redisUtil.exists(sysusers.getName())) { logger.info("活跃用户+1:" + sysusers.getName()); redisUtil.set(sysusers.getName(), sysusers, 1, TimeUnit.DAYS); } return tokenMap; } } else { tokenMap.put("token", "不存在此用户"); } return tokenMap; }
原文地址:https://www.cnblogs.com/yq-cc/p/11320324.html
- 《了不起的 nodejs》中 TwitterWeb 案例 bug 解决
- java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别
- 【java开发系列】—— Tomcat编译报错
- java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
- 《像计算机科学家一样思考Java》—— 读后总结
- 记录安装oracle的那些事(三)之oracle Database R2安装
- Elasticsearch Javascript API增删改查
- Oracle二三事之 Oracle SPARC SuperCluster的九大技术优势
- 两个 viewports 的故事-第二部分
- 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽
- AngularJS 技术总结
- 《linux c编程指南》学习手记5
- AngularJS API之bootstrap启动
- 通过 JS 判断页面是否有滚动条的简单方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法