SpringBoot2如何整合JWT框架解决Token跨域验证问题
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,小编给大家分享一下SpringBoot2如何整合JWT框架解决Token跨域验证问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解
千家信息网最后更新 2025年02月03日SpringBoot2如何整合JWT框架解决Token跨域验证问题
小编给大家分享一下SpringBoot2如何整合JWT框架解决Token跨域验证问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
一、传统Session认证
1、认证过程
1、用户向服务器发送用户名和密码。2、服务器验证后在当前对话(session)保存相关数据。3、服务器向返回sessionId,写入客户端 Cookie。4、客户端每次请求,需要通过 Cookie,将 sessionId 回传服务器。5、服务器收到 sessionId,验证客户端。
2、存在问题
1、session保存在服务端,客户端访问高并发时,服务端压力大。2、扩展性差,服务器集群,就需要 session 数据共享。
二、JWT简介
JWT(全称:JSON Web Token),在基于HTTP通信过程中,进行身份认证。
1、认证流程
1、客户端通过用户名和密码登录服务器;2、服务端对客户端身份进行验证;3、服务器认证以后,生成一个 JSON 对象,发回客户端;4、客户端与服务端通信的时候,都要发回这个 JSON 对象;5、服务端解析该JSON对象,获取用户身份;6、服务端可以不必存储该JSON(Token)对象,身份信息都可以解析出来。
2、JWT结构说明
抓一只鲜活的Token过来。
{ "msg": "验证成功", "code": 200, "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9. eyJzdWIiOiJhZG1pbiIsImlhdCI6iZEIj3fQ. uEJSJagJf1j7A55Wwr1bGsB5YQoAyz5rbFtF"}
上面的Token被手动格式化了,实际上是用"."分隔的一个完整的长字符串。
JWT结构
1、头部(header) 声明类型以及加密算法;2、负载(payload) 携带一些用户身份信息;3、签名(signature) 签名信息。
3、JWT使用方式
通常推荐的做法是客户端在 HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer
服务端获取JWT方式
String token = request.getHeader("token");
三、与SpringBoot2整合
1、核心依赖文件
io.jsonwebtoken jjwt 0.7.0
2、配置文件
server: port: 7009spring: application: name: ware-jwt-tokenconfig: jwt: # 加密密钥 secret: iwqjhda8232bjgh532[cicada-smile] # token有效时长 expire: 3600 # header 名称 header: token
3、JWT配置代码块
@ConfigurationProperties(prefix = "config.jwt")@Componentpublic class JwtConfig { /* * 根据身份ID标识,生成Token */ public String getToken (String identityId){ Date nowDate = new Date(); //过期时间 Date expireDate = new Date(nowDate.getTime() + expire * 1000); return Jwts.builder() .setHeaderParam("typ", "JWT") .setSubject(identityId) .setIssuedAt(nowDate) .setExpiration(expireDate) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } /* * 获取 Token 中注册信息 */ public Claims getTokenClaim (String token) { try { return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); }catch (Exception e){ e.printStackTrace(); return null; } } /* * Token 是否过期验证 */ public boolean isTokenExpired (Date expirationTime) { return expirationTime.before(new Date()); } private String secret; private long expire; private String header; // 省略 GET 和 SET}
四、Token拦截案例
1、配置Token拦截器
@Componentpublic class TokenInterceptor extends HandlerInterceptorAdapter { @Resource private JwtConfig jwtConfig ; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 地址过滤 String uri = request.getRequestURI() ; if (uri.contains("/login")){ return true ; } // Token 验证 String token = request.getHeader(jwtConfig.getHeader()); if(StringUtils.isEmpty(token)){ token = request.getParameter(jwtConfig.getHeader()); } if(StringUtils.isEmpty(token)){ throw new Exception(jwtConfig.getHeader()+ "不能为空"); } Claims claims = jwtConfig.getTokenClaim(token); if(claims == null || jwtConfig.isTokenExpired(claims.getExpiration())){ throw new Exception(jwtConfig.getHeader() + "失效,请重新登录"); } //设置 identityId 用户身份ID request.setAttribute("identityId", claims.getSubject()); return true; }}
2、拦截器注册
@Configurationpublic class WebConfig implements WebMvcConfigurer { @Resource private TokenInterceptor tokenInterceptor ; public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(tokenInterceptor).addPathPatterns("/**"); }}
3、测试接口代码
@RestControllerpublic class TokenController { @Resource private JwtConfig jwtConfig ; // 拦截器直接放行,返回Token @PostMapping("/login") public Maplogin (@RequestParam("userName") String userName, @RequestParam("passWord") String passWord){ Map result = new HashMap<>() ; // 省略数据源校验 String token = jwtConfig.getToken(userName+passWord) ; if (!StringUtils.isEmpty(token)) { result.put("token",token) ; } result.put("userName",userName) ; return result ; } // 需要 Token 验证的接口 @PostMapping("/info") public String info (){ return "info" ; }}
以上是"SpringBoot2如何整合JWT框架解决Token跨域验证问题"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
服务
验证
客户
客户端
服务器
身份
用户
信息
认证
对象
问题
整合
数据
篇文章
拦截器
配置
框架
代码
内容
密码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
golang服务器怎么用
新加坡软件开发企业免税吗
为什么玩游戏需要访问服务器
应城市公安局网络安全课
web网络安全服务社团
无锡智能刀片服务器直销
行业分析数据库
win7怎么备份数据库
数据库和消息队列区别
网络安全训练营如何抓包
移动行业的网络安全问题
自考软件开发工具是上机考吗
卓易信息网络安全
ebsco数据库
炫舞时代服务器选择
xml如何存入数据库
台州银行杭州软件开发
wind数据库有时候加载不出
无锡的软件开发工资水平
域名如何在iis服务器
golang服务器怎么用
大连软件开发培训
哪个英文数据库有中文
网络安全应急处置的主要内容
软件开发工程师35岁瓶颈
云服务器硬盘
深圳交通银行软件开发中心地址
开平市网络安全宣传知识
山丹培黎学校网络技术安全
sql数据库能直接复制粘贴