jwt如何与springboot拦截器配合使用
时间: 2024-01-03 13:04:00 浏览: 99
JWT(JSON Web Token)是一种用于在网络应用之间传递声明的基于 JSON 的开放标准。Spring Boot 提供了一种简单的方式来实现 JWT 的认证和授权,可以与 Spring Boot 的拦截器配合使用。
以下是使用 JWT 和 Spring Boot 拦截器实现认证和授权的基本步骤:
1. 添加依赖
在 pom.xml 文件中添加以下依赖:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
2. 创建 JWT 工具类
创建一个 JWT 工具类,用于生成和解析 JWT。
```java
public class JwtUtils {
private static final String SECRET_KEY = "mySecretKey";
public static String createToken(User user) {
return Jwts.builder()
.setSubject(user.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
public static boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
return true;
} catch (JwtException | IllegalArgumentException e) {
return false;
}
}
public static String getUsernameFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
}
}
```
3. 创建拦截器
创建一个拦截器,用于在请求到达控制器前对 JWT 进行认证和授权。
```java
@Component
public class JwtInterceptor implements HandlerInterceptor {
private static final String AUTHORIZATION_HEADER = "Authorization";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = request.getHeader(AUTHORIZATION_HEADER);
if (StringUtils.hasText(token) && token.startsWith("Bearer ")) {
token = token.substring(7);
if (JwtUtils.validateToken(token)) {
String username = JwtUtils.getUsernameFromToken(token);
request.setAttribute("username", username);
return true;
}
}
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
}
```
4. 注册拦截器
在 Spring Boot 应用程序中注册拦截器。
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private JwtInterceptor jwtInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor).excludePathPatterns("/login");
}
}
```
在上面的示例中,我们排除了 `/login` 路径,因为该路径不需要进行认证和授权。
5. 在控制器中获取用户名
在控制器中获取用户的用户名。
```java
@RestController
public class UserController {
@GetMapping("/user")
public String getUser(@RequestAttribute("username") String username) {
return "Hello, " + username;
}
}
```
在上面的示例中,我们使用 `@RequestAttribute` 注解获取在拦截器中设置的 `username` 属性。
以上就是使用 JWT 和 Spring Boot 拦截器实现认证和授权的基本步骤。
阅读全文