开发基础
开发基础笔记
mybatis-plus通用的service方法
通过jenkins配置前后端自动打包及发布
mybatis-plus实现分页的方式
Java极客技术公众号PDF
狂神说SpringBoot
Hashids java 版使用
SpringBoot
1、Web快速开发
2、结果集的封装
3、集成MyBatis实现数据库操作
4、Springboot @Validated参数校验
5、SpringBoot全局异常处理
6、拦截器HandlerInterceptor
7、集成Swagger实现API自动生成
8、集成knife4j实现API自动生成
9、Springboot集成MyBatis-Plus快速入门
10、springboot自定义注解及AOP切面使用
11、使用Shiro实现登陆和权限认证,基于MyBatis
12、集成SpringSecurity实现授权认证
13、SpringBoot集成EasyExcel实现数据导入与导出
14、Spring Task定时任务的实现
15、Quartz快速上手与实践
16、如何用代码实现Spring IOC
17、SpringBoot集成JWT,实现接口的鉴权交互
SpringCloud
Nacos作为服务注册中心
seata1.6.1 结合springcloud实现分布锁的技术笔记
一些技术博客推荐
前端面试相关
看这一篇就够了
java.util包常用的类和接口
CountDownLatch介绍与使用
Common-lang3使用入门
Hutool简单使用入门
lombok 介绍及基本使用方法
git项目统计成员代码行数和提交的次数
mysql 逗号分隔的数据 like查询
使用sonar进行代码质量检查
线上使用jmeter进行压测的时候,使用Arthas诊断工具排查响应慢的接口
php结合phpstudy8、vscode开启xdebug进行代码调试
node-red使用入门
本文档使用 MrDoc 发布
-
+
首页
17、SpringBoot集成JWT,实现接口的鉴权交互
## pom引入 ~~~xml <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ~~~ ## 建一个utils的工具类,用于使用jwt。 ~~~java package com.mmno.framework.util; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.Date; import java.util.HashMap; import java.util.Map; public class JwtUtil { private static final String secret = "seqier"; private static final Long expiration = 1209600L; /** * 生成用户token,设置token超时时间 */ public static String createToken(String userName) { //过期时间 Date expireDate = new Date(System.currentTimeMillis() + expiration * 1000); Map<String, Object> map = new HashMap<>(); map.put("alg", "HS256"); map.put("typ", "JWT"); String token = JWT.create() // 添加头部 .withHeader(map) //可以将基本信息放到claims中 //userName .withClaim("userName", userName) //超时设置,设置过期的日期 .withExpiresAt(expireDate) //签发时间 .withIssuedAt(new Date()) //SECRET加密 .sign(Algorithm.HMAC256(secret)); System.out.println(token); return token; } /** * 校验token并解析token */ public static boolean verifyToken(String token) { DecodedJWT jwt; try { JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build(); jwt = verifier.verify(token); if (jwt.getExpiresAt().before(new Date())) { System.out.println("token过期"); return false; } } catch (Exception e) { //解码异常则抛出异常 System.out.println("token解析异常:" + e.getMessage()); return false; } return true; } } ~~~ ## 在service层的login接口里可以使用 createToken方法生成一段token 这里在jwt里只保存了一个载体,也就是username,你也可以根据实际的业务情总 保存更多的数据,比如 id mobild等。 ~~~java // 生成token String token = JwtUtil.createToken(shopUser.getUsername()); ~~~ ## 新建一个拦截器,限制只有在header里传输了正确的token值 才可以正常访问接口。 ~~~java package com.mmno.shop.interceptor; import cn.hutool.json.JSONUtil; import com.auth0.jwt.exceptions.AlgorithmMismatchException; import com.auth0.jwt.exceptions.InvalidClaimException; import com.auth0.jwt.exceptions.SignatureVerificationException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.mmno.framework.util.JwtUtil; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token= request.getHeader("token"); Map<String, Object> map= new HashMap<>(); if (token== null || token.trim().equals("")){ map.put("message", "无token值!"); } else{ try{ JwtUtil.verifyToken(token); return true; } catch (SignatureVerificationException e){ e.printStackTrace(); map.put("message", "签名不一致!"); } catch (TokenExpiredException e){ e.printStackTrace(); map.put("message","令牌过期!"); } catch (AlgorithmMismatchException e){ e.printStackTrace(); map.put("message", "算法不匹配!"); } catch (InvalidClaimException e){ e.printStackTrace(); map.put("message","失效payload!"); } catch (Exception e){ e.printStackTrace(); map.put("message","token无效"); } } map.put("state", false); // 使用hutool里的JSONUtil 将map转为json String json= JSONUtil.toJsonStr(map); response.setContentType("application/json;charset=UTF-8"); response.getWriter().println(json); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("拦截器处理结束..."); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("请求结束..."); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } } ~~~ ## 注册这个拦截器 我这里的 addPathPatterns() 定义要拦截哪个url,也可以使用下面这两种形式 .addPathPatterns("/**") .addPathPatterns("/api/user/**") excludePathPatterns 定义哪些地址不需要拦截 `/shop/passport/logout` `/shop/passport/login` 是我的登录和登出接口,要放行! ~~~java package com.mmno.shop.interceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class MyWebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TokenInterceptor()) .addPathPatterns() .excludePathPatterns("/shop/passport/logout", "/shop/passport/login"); } } ~~~
superadmin
2024年9月10日 17:29
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码