当前位置: 首页 > news >正文

封装工具类,JwtUtils令牌工具类

1.工具类中有两个方法,一个方法生成令牌,另一个是解析令牌。

2.生成令牌时使用的秘钥可以通过base解析

https://base64.us/

3.令牌的过期时间设置12小时。

工具类代码:

package com.itheima.utils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.Map; /** * JWT 令牌操作工具类 */ public class JwtUtils { // 1. 密钥:沿用测试类中的密钥 private static final String SECRET_KEY = "aXRoZWltYQ=="; // 2. 过期时间:12小时 (12 * 60 * 60 * 1000 毫秒) //private static final Long EXPIRE_TIME = 43200000L; private static final long EXPIRATION_TIME = 12 * 60 * 60 * 1000; /** * 生成 JWT 令牌 * * @param claims 自定义载荷数据 (如 id, username 等) * @return 生成的 JWT 字符串 */ public static String generateToken(Map<String, Object> claims) { return Jwts.builder() .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 指定签名算法和密钥 .addClaims(claims) // 添加自定义信息 .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间 .compact(); // 生成令牌 } /** * 解析 JWT 令牌 * * @param token 待解析的 JWT 字符串 * @return Claims 对象,包含令牌中的信息 */ public static Claims parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET_KEY) // 指定密钥 .parseClaimsJws(token) // 解析令牌 .getBody(); // 获取载荷信息 } }

刚才通过浏览器的开发者工具,我们可以看到在后续的请求当中,都会在请求头中携带JWT令牌到服务端,而服务端需要统一拦截所有的请求,从而判断是否携带的有合法的JWT令牌。

那怎么样来统一拦截到所有的请求校验令牌的有效性呢?这里我们会学习两种解决方案:

  1. Filter过滤器

  2. Interceptor拦截器

过滤器链:

我们要完成登录校验,主要是利用Filter过滤器实现,而Filter过滤器的流程步骤:

代码实现:

package com.itheima.filter; import com.itheima.utils.JwtUtils; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import java.io.IOException; @Slf4j @WebFilter(urlPatterns = "/*") public class TokenFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; // 1.获取到请求路径 String requestURI = request.getRequestURI(); // employee/login // 2.判断是否是登录请求,如果路径中包含 /login, 说明是登录操作,放行 if(requestURI.contains("/login")){ log.info("登录请求,放行"); filterChain.doFilter(request, response); return; } // 3.获取请求头中的token String token = request.getHeader("token"); // 4.判断token是否存在,如果不存在,说明用户没有登录。返回错误信息(响应401状态码) if(token == null){ log.info("令牌为空,响应401"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } // 5.如果token存在,校验令牌,如果校验失败 -> 返回错误信息(响应401状态码) try { JwtUtils.parseToken(token); } catch (Exception e) { log.info("令牌非法,响应401"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } // 6.校验通过,放行 log.info("令牌合法,放行"); filterChain.doFilter(request, response); } }

拦截器

代码实现:

config/

package com.itheima.config; import com.itheima.interceptor.DemoInterceptor; import com.itheima.interceptor.TokenInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; 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 WebConfig implements WebMvcConfigurer { //@Autowired //private DemoInterceptor demoInterceptor; @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //registry.addInterceptor(demoInterceptor) // .addPathPatterns("/**"); registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/login"); } }

interceptor/

package com.itheima.interceptor; import com.itheima.utils.JwtUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; /** * 令牌校验的拦截器 */ @Slf4j @Component public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 1.获取到请求路径 String requestURI = request.getRequestURI(); // employee/login // 2.判断是否是登录请求,如果路径中包含 /login, 说明是登录操作,放行 if(requestURI.contains("/login")){ log.info("登录请求,放行"); return true; } // 3.获取请求头中的token String token = request.getHeader("token"); // 4.判断token是否存在,如果不存在,说明用户没有登录。返回错误信息(响应401状态码) if(token == null){ log.info("令牌为空,响应401"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } // 5.如果token存在,校验令牌,如果校验失败 -> 返回错误信息(响应401状态码) try { JwtUtils.parseToken(token); } catch (Exception e) { log.info("令牌非法,响应401"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } // 6.校验通过,放行 log.info("令牌合法,放行"); return true; } }
http://www.jsqmd.com/news/793287/

相关文章:

  • 【没事学点啥】TurboBlog轻量级个人博客项目——Turbo Blog 项目学习与上线指南
  • HQChart使用教程105-K线图,分时图如何对接AI进行数据分析
  • 基于ESP32-S3与CAN总线的开源机械臂控制器设计
  • 抖音下载器终极指南:三步轻松保存无水印视频和音乐
  • 3分钟破解百度网盘限速:直链生成工具终极指南
  • 基于Kubernetes部署Dify AI开发平台:从Docker Compose到生产级K8s方案全解析
  • 开源仿生夹爪crawdad-openclaw:从3D打印到智能抓取的完整实践指南
  • 如何快速提取Unity游戏资源?AssetStudio终极使用指南
  • 物流分拣系统:C# + YOLOv12实现快递面单信息提取与包裹体积测量
  • 【VUE专题】2. 零基础-ElementUI前端组件安装使用保姆级教程
  • 微信聊天记录永久保存与深度分析:你的数字记忆守护者
  • 第五篇:Spring事务管理——@Transactional的底层实现与失效场景
  • 软考高项选老师:这6句常见话术,听懂了你就不被割
  • Cursor AI用量监控插件:实时掌控成本,告别超支惊喜
  • 二手电车处处是坑,坐实快消品的名号,买电车只应买低价车
  • 3DGS火出圈:未来十年AI不只读写,更要看、建、做
  • 在内容生成场景中借助 Taotoken 灵活调用不同风格大模型
  • Claude Code装上“眼睛“:Browserbase Skills让AI能浏览网页
  • AI在辅助生殖中的应用:胚胎评估与妊娠预测的技术解析
  • Xcode项目自动化管理利器:xcode-claw命令行工具深度解析
  • AI编码助手如何通过Crowdin Agent Skills提升本地化工程效率
  • 样本生成的物理约束自适应风格迁移网络用于跨设备小样本故障诊断|IEEE trans期刊
  • 别把 `transformers` 新一代 MoE 支持理解成“多了个 `grouped_mm`”:真正重画的是权重布局、expert backend、expert parallel、router 训
  • AI聊天插件开发实战:基于SDK构建天气查询插件
  • Redis之父antirez发布DeepSeek V4 Flash专用推理引擎,128GB MacBook本地跑284B参数大模型
  • DSP架构设计与低功耗优化关键技术解析
  • axios 文件传输实战:从基础上传到Excel流式下载
  • 【2026年版|建议收藏】大模型是如何思考的?揭秘LLM推理完整过程(小白程序员入门必看)
  • 4.ROS基础编程(2.基本数据结构或API分析)
  • STM32F407用CubeMX配置I2C驱动MPU6050,避开PB6/PB7引脚重映射的坑