JavaWeb实现用户登录:拦截器与JWT令牌集成
"本文将介绍如何使用拦截器和JWT(JSON Web Token)令牌来实现用户登录功能。我们将探讨JWT依赖的引入、相关配置、属性类的创建以及JWT工具类的构建。" 在Web应用程序中,用户认证是核心部分,而JWT提供了一种安全且轻量级的方式来验证用户身份。JWT令牌包含三个部分:头部(Header)、载荷(Payload)和签名(Signature)。当用户成功登录后,服务器会生成一个JWT,并将其返回给客户端,客户端在后续的请求中携带这个令牌,服务器通过验证令牌来确认用户的身份。 ### 1. 引入JWT依赖 为了在项目中使用JWT,首先需要在Maven的`pom.xml`文件中引入JWT的依赖库。这里引入的是`jjwt`库,版本号为0.9.1。这样就可以在Java代码中使用JWT的相关API了。 ```xml <!--JWT依赖--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` ### 2. 配置JWT属性 在`yml`配置文件中,我们需要定义JWT的相关属性,包括签名的密钥、令牌的过期时间和前端传递的令牌名称。这里有两个不同的配置,分别针对管理员(admin)和用户(user),确保了不同角色的安全策略。 ```yaml sky: jwt: # 管理员JWT配置 admin-secret-key: itcast admin-ttl: 720000000 admin-token-name: token # 用户JWT配置 user-secret-key: itheima user-ttl: 7200000 user-token-name: authentication ``` ### 3. 创建属性类 为了方便地读取和使用配置文件中的JWT属性,我们可以创建一个名为`JwtProperties`的配置类,使用`@Component`和`@ConfigurationProperties`注解,使Spring Boot能够自动注入这些属性。 ```java package com.sky.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "sky.jwt") public class JwtProperties { / * 管理员JWT配置 */ private String adminSecretKey; private long adminTtl; private String adminTokenName; / * 用户JWT配置 */ private String userSecretKey; private long userTtl; private String userTokenName; } ``` ### 4. 构建JWT工具类 接下来,我们需要一个工具类来处理JWT的生成和验证。这个工具类通常包含生成JWT、解析JWT和检查JWT是否有效等功能。以下是一些基本方法的示例: ```java package com.sky.utils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JwtUtils { // 获取JWT工具类中的属性 private static final JwtProperties jwtProperties = ...; // 生成JWT public static String generateToken(String username, boolean isAdmin) { // 使用对应的角色密钥和过期时间 long ttlMillis = isAdmin ? jwtProperties.getAdminTtl() : jwtProperties.getUserTtl(); return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + ttlMillis)) .signWith(SignatureAlgorithm.HS512, isAdmin ? jwtProperties.getAdminSecretKey() : jwtProperties.getUserSecretKey()) .compact(); } // 解析JWT public static Claims parseToken(String token) { return Jwts.parser() .setSigningKey(isAdmin(token) ? jwtProperties.getAdminSecretKey() : jwtProperties.getUserSecretKey()) .parseClaimsJws(token).getBody(); } // 检查JWT是否有效 public static boolean isValid(String token) { try { parseToken(token); return true; } catch (Exception e) { return false; } } // 判断JWT属于管理员还是用户 private static boolean isAdmin(String token) { // 从JWT中获取角色信息并判断 return parseToken(token).getSubject().equals("admin"); } } ``` ### 拦截器的使用 在Spring MVC中,我们可以创建一个拦截器来处理每个请求,检查JWT令牌的有效性。当用户发送请求时,拦截器会读取请求头中的JWT令牌,然后通过`JwtUtils`类进行验证。如果令牌有效,请求会被允许继续;否则,返回错误响应,提示用户重新登录。 ```java import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 从请求头中获取JWT令牌 String token = request.getHeader(jwtProperties.getAdminTokenName()); if (token == null || !JwtUtils.isValid(token)) { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); return false; } return true; } // 其他Interceptor方法... } ``` 最后,别忘了在Spring MVC配置中注册这个拦截器,以便它能在每个请求中执行。 通过上述步骤,我们就实现了基于JWT和拦截器的用户登录功能。用户每次发起请求时,都会携带JWT令牌,服务器则通过拦截器和JWT工具类验证其有效性,从而确保只有经过授权的用户才能访问受保护的资源。
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 1
- 资源: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)