欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > 【Java】基于JWT+Token实现完整登入功能(实操)

【Java】基于JWT+Token实现完整登入功能(实操)

2025/5/11 16:57:57 来源:https://blog.csdn.net/m0_66070037/article/details/141968554  浏览:    关键词:【Java】基于JWT+Token实现完整登入功能(实操)

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


文章目录

  • Java系列文章目录
  • 一、前言
  • 二、学习内容:
  • 三、问题描述
  • 四、解决方案:
    • 4.1 认识依赖
    • 4.2 使用JWT
    • 4.3 登入实现
    • 4.4 配置拦截器
    • 4.5 获取数据
  • 五、总结:

一、前言

  • 学习如何在登入过程保证传输信息安全
  • 流程图原作者 流程图来源 JWT的讲解也有可看这篇文章
  • 本文以实操为主
  • 本文自定义工具类仅仅是示例

二、学习内容:

  • Token+Redis 方法

一种结合JWT与Redis的解决方案

  • 服务器生成令牌并将器存储在Redis中,同时前端只持有此令牌本身

三、问题描述

  • 保证传输的安全性
  • 想了解JWT可看这篇文章 流程图来源

实操如下流程:
在这里插入图片描述


四、解决方案:

4.1 认识依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version><scope>runtime</scope>
</dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.2</version><scope>runtime</scope>
</dependency>
  • 使用JWT需要的依赖

4.2 使用JWT

  • JwtConfig通过properties文件配置JWT

在这里插入图片描述

  • JWT的工具类

这个只是示例使用安全性可能没那么高可以用专门的封装库

@Component
public class JwtUtil {@Autowiredprivate JwtConfig jwtConfig;private final Key key ;public JwtUtil(JwtConfig jwtConfig){this.jwtConfig=jwtConfig;key = Keys.hmacShaKeyFor(jwtConfig.getKey().getBytes());}
//创建public String createJwt(String id) {Claims claims = Jwts.claims();claims.put("id",id);return Jwts.builder().setClaims(claims)//.setExpiration(new Date(System.currentTimeMillis() + jwtConfig.getTtl())).signWith(key).compact();}
//解密public Claims parseJwt(String token) {return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();}public boolean validateToken(String token) {try {Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);return true;} catch (Exception e) {return false;}}
}

4.3 登入实现

密码比较不可以用equals,明码比较的话安全性低

  1. 前端输入账号密码
  2. 根据账号获得数据库加密的密码
  3. 前端密码加密后跟数据库密码比较
  4. 比对成功后签Token返回

🌟 前端要获取Token
🌟 JWT不是很安全,用户的密码一定不能保存到JWT中

登入逻辑如下:
在这里插入图片描述

后端控制层与逻辑层:
在这里插入图片描述

  • 测试登入

ApiPost模拟前端

登入后返回前端的数据
在这里插入图片描述

  • 后台显示结果

在这里插入图片描述

4.4 配置拦截器

  • 拦截器排除登入以外的路径

拦截器拦截判断请求头与Token

🌟 前端已经收到Token了接下来交互验证都通过这个Token
🌟 拦截后验证Token是否过期

拦截器逻辑如下:
在这里插入图片描述

拦截器代码如下:
在这里插入图片描述

4.5 获取数据

  • 主要判断头部以及Token是否过期并顺便进行延期

登入后访问其他页面不需要再重新登入,因为已经持有Token且没有过期

🌟 通过拦截器后执行业务逻辑

获取数据逻辑:
在这里插入图片描述

获取数据代码:
在这里插入图片描述

  • 如果Token存储时间不够会进行延期处理

如果长时间没使用就退出

在这里插入图片描述

  • 经过审核后返回数据

ApiPost模拟前端

在这里插入图片描述


五、总结:

JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它是一个轻量级的跨平台解决方案,可以在不同的系统之间安全地传输和验证信息。

JWT由三部分组成:头部(Header)、负载(Payload)和签名(Signature)。

  • 头部包含了加密算法、令牌类型等信息,一般使用Base64编码进行编码。
  • 负载是JWT的主要部分,包含了一些声明(claims),例如用户ID、角色等信息。负载也可以包含自定义的声明。负载也使用Base64编码进行编码。
  • 签名用于保证令牌的完整性和真实性。签名由头部、负载、预先定义的密钥和指定的加密算法组成。一般使用HMAC(Hash-based
    Message Authentication Code)或RSA(Rivest-Shamir-Adleman)算法进行签名。

使用JWT进行身份验证和授权的流程如下:

用户登录,服务器验证用户信息。
服务器生成JWT,将用户信息和其他必要的信息编码到负载中。
服务器使用密钥对JWT进行签名,生成签名。
服务器将JWT和签名返回给客户端。
客户端在后续请求中将JWT放入请求头、Cookie或其他合适的位置进行传输。
服务器验证JWT的签名,并根据负载中的信息进行权限控制和身份验证。
JWT的优点是简单、轻量级、跨平台、可扩展性强,并且不需要在服务器端保存用户的登录状态。缺点是一旦签发的JWT被盗用,无法立即使其失效,除非附加一些额外的逻辑来实现JWT的撤销。

在使用JWT时需要注意以下几点:

JWT中不应包含敏感信息,因为负载是经过Base64编码的,可能会被解码。
密钥的安全非常重要,因为密钥用于生成和验证签名。应该使用强密码来保护密钥,并定期更换密钥。
JWT的过期时间应该适当设置,以免被盗用后长时间有效。
如果需要撤销JWT,可以使用黑名单或者额外的逻辑来实现。

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词