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

SpringBoot 之 JWT

介绍

官网

JSON Web Tokens - jwt.io

应用

依赖 Maven

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version>
</dependency>

工具类 JWTUtils.class


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.Base64UrlCodec;import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;/*** @author ldz* @description TODO JWT工具类* @date 2021/10/10*/
public class JWTUtils {/*** 过期时间*/private static final long EXPRESSION_TIME = 1000 * 60 * 60 * 24;private static final String SECRET = "fnpt";private static final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;public static HashMap<String, String> getToken(String subject) throws Exception {Date st = new Date();Date et = new Date(st.getTime() + EXPRESSION_TIME);JwtBuilder builder = Jwts.builder().setSubject(subject).setIssuedAt(st).setExpiration(et).signWith(signatureAlgorithm, SECRET);HashMap<String, String> res = new HashMap<>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");res.put("token", builder.compact());res.put("expiresTime", sdf.format(et));return res;}/*** 解析JWT** @param jwtStr* @return*/public static Claims parseJWT(String jwtStr) throws Exception {return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtStr).getBody();}/*** 验证jwt** @param jwtStr* @return*/public static String validateJWT(String jwtStr) throws Exception {Claims claims = parseJWT(jwtStr);return JSON.toJSONString(claims);}/*** 不需要解析token的payload** @param token* @param cls* @param <T>* @return* @throws Exception*/public static <T> T decodeTokenPayload(String token, Class<T> cls) throws Exception {try {String payload = token.substring(token.indexOf(".") + 1, token.lastIndexOf("."));String jxh = new String(new Base64UrlCodec().decode(payload), "UTF-8");Object sub = JSON.parseObject(jxh).get("sub");return JSON.parseObject(sub.toString(), (Type) cls);} catch (Exception e) {e.printStackTrace();return cls.newInstance();}}public static JSONObject decodeTokenPayload(String token) throws Exception {String payload = token.substring(token.indexOf(".") + 1, token.lastIndexOf("."));String jxh = new String(new Base64UrlCodec().decode(payload), "UTF-8");Object sub = JSON.parseObject(jxh).get("sub");return JSON.parseObject(sub.toString());}
}

拦截器  JWTInterceptor.class

import com.alibaba.fastjson2.JSONObject;
import com.example.entity.vo.Response;
import com.example.utils.JWTUtils;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.SignatureException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Slf4j
public class JWTInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Response r = new Response();String token = request.getHeader("token");//获取请求头中的tokentry {JWTUtils.validateJWT(token);return true;//验证通过,就会去controller请求数据了} catch (SignatureException e) {r.setCode(-1).setMessage("签名异常");log.error(e.getMessage());} catch (ExpiredJwtException e) {log.error(e.getMessage());r.setCode(-1).setMessage("token过期");} catch (Exception e) {log.error(e.getMessage());r.setCode(-1).setMessage("无效签名!");}String jsonObject = JSONObject.toJSONString(r);response.setContentType("application/json;charset=UTF-8");response.getWriter().println(jsonObject);//错误信息发送回前台return false;}
}

总web配置 WebConfig.class

import com.example.intercepters.JWTInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new JWTInterceptor()).addPathPatterns("/**").excludePathPatterns("/tysl/**").excludePathPatterns("/login/*");//登陆接口放行}
}

相关文章:

  • Redis缓存-数据淘汰策略
  • 从“Bucharest”谈起:词语翻译的音译与意译之路
  • 电脑硬盘分几个区好
  • 08.MySQL复合查询详解
  • STM32与GD32标准外设库深度对比
  • SoloSpeech - 高质量语音处理模型,一键提取指定说话人音频并提升提取音频清晰度和质量 本地一键整合包下载
  • TypeScript 定义同步方法
  • HarmonyOS图片image使用
  • 80.在服务器部署LLAVA模型
  • 【Doris基础】Apache Doris中的Fragment概念详解
  • Agno:使用简单代码构建AI智能体
  • JS语法笔记
  • 风云二号G星:我国气象监测的“天眼”
  • 小巧实用,Windows文件夹着色软件推荐
  • MySQL强化关键_019_索引优化
  • [Linux] MySQL源码编译安装
  • MySQL计算精度计算加减乘除取模方式和方法总计
  • 2025年06月03日Github流行趋势
  • 【散刷】二叉树基础OJ题(二)
  • 【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools
  • 小程序加盟代理前景/aso优化排名违法吗
  • 驻马店企业做网站/更厉害的病毒2024
  • wordpress修改文章字体大小/西安百度首页优化
  • 专做腰带的网站/济南百度
  • php 网站做分享功能/搜索引擎优化的核心及内容
  • 在美国克罗格做网站怎样/qq群排名优化