当前位置: 首页 > 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/*");//登陆接口放行}
}

http://www.lqws.cn/news/99001.html

相关文章:

  • 8.RV1126-OPENCV 视频中添加LOGO
  • Web后端快速入门(Maven)
  • OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤
  • Vert.x学习笔记-Verticle原理解析
  • Java数据校验:确保数据完整性和正确性
  • Modbus转Ethernet IP赋能挤出吹塑机智能监控
  • ChatGPT实战嵌入式开发应用指南与代码演示
  • 笔记本/台式C盘扩容:删除、压缩、跨分区与重分配—「小白教程」
  • 调用.net DLL让CANoe自动识别串口号
  • [Java恶补day14] 56. 合并区间
  • SQL 筛选出在表1但不在表2中的数据
  • Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件
  • 【Redis】set 类型
  • qt控制台程序与qt窗口程序在读取数据库中文字段的差异!!巨坑
  • MySQL 如何判断某个表中是否存在某个字段
  • 基于PostGIS的GeoTools执行原生SQL查询制图实践-以贵州省行政区划及地级市驻地为例
  • React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术
  • 结构性设计模式之Composite(组合)
  • Spring AI 项目实战(一):Spring AI 核心模块入门
  • MongoDB数据库学习
  • 宇树科技更名“股份有限公司”深度解析:机器人企业IPO前奏与资本化路径
  • 业态即战场:零售平台的生意模型与系统设计解构
  • EtherCAT背板方案:方芯半导体工业自动化领域的高速、高精度的通信解决方案
  • 定时器时钟来源可以从输入捕获引脚输入
  • RK3568-移植codesys-runtime
  • 【RabbitMQ】- Channel和Delivery Tag机制
  • 『React』组件副作用,useEffect讲解
  • 灵活运用 NextJS 服务端组件与客户端组件
  • Dify:启动 Web 服务的详细指南
  • CSS 平铺+自动换行效果