请详细生成一份spring boot+mybatisplus使用token校验
时间: 2023-10-08 20:04:02 浏览: 116
基于spring boot 2集成mybatis-plus的简单实例
好的,下面是一份使用 Spring Boot 和 MyBatis Plus 实现 Token 校验的示例代码:
1. 首先,我们需要在 pom.xml 文件中添加相关依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
```
其中,`${spring.boot.version}`、`${mybatis.plus.version}` 和 `${jjwt.version}` 分别表示 Spring Boot、MyBatis Plus 和 JWT 的版本号,可以根据需要进行修改。
2. 创建一个 TokenUtils 工具类,用于生成和解析 JWT:
```java
public class TokenUtils {
private static final String SECRET_KEY = "your_secret_key";
private static final long EXPIRATION_TIME = 86400000L; // token 过期时间为 24 小时
public static String generateToken(User user) {
Date now = new Date();
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);
return Jwts.builder()
.setSubject(user.getUsername())
.claim("userId", user.getId())
.setIssuedAt(now)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static User parseToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
return new User(
Long.parseLong(claims.get("userId").toString()),
claims.getSubject()
);
}
}
```
其中,`generateToken()` 方法用于生成 JWT,`parseToken()` 方法用于解析 JWT。`SECRET_KEY` 是一个字符串,用于签名 JWT,应该保密存储。`EXPIRATION_TIME` 表示 token 的过期时间,这里设置为 24 小时。
3. 创建一个 AuthInterceptor 拦截器,用于拦截需要进行 Token 校验的请求:
```java
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
try {
User user = TokenUtils.parseToken(token);
request.setAttribute("currentUser", user);
return true;
} catch (Exception e) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
} else {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
}
}
```
其中,`preHandle()` 方法会在请求到达控制器之前被调用,如果请求头中包含有效的 JWT,则将其解析出来,并将当前用户信息存储到 `HttpServletRequest` 对象中,然后返回 `true`;否则,返回 `false`,并设置响应状态码为 401(未授权)。
4. 在 Spring Boot 的配置类中注册 AuthInterceptor 拦截器:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/api/**")
.excludePathPatterns("/api/user/login"); // 登录接口不需要进行 token 校验
}
}
```
其中,`.addPathPatterns("/api/**")` 表示对 `/api` 目录下的所有请求进行拦截,`.excludePathPatterns("/api/user/login")` 表示对 `/api/user/login` 接口不进行拦截。
5. 在控制器中使用 `@CurrentUser` 注解获取当前用户信息:
```java
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
public Result login(@RequestBody LoginRequest request) {
User user = userService.login(request.getUsername(), request.getPassword());
String token = TokenUtils.generateToken(user);
return Result.success(token);
}
@GetMapping("/info")
public Result getUserInfo(@CurrentUser User user) {
return Result.success(user);
}
}
```
其中,`@CurrentUser` 注解用于从 `HttpServletRequest` 对象中获取当前用户信息,代码如下:
```java
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
```
```java
@ControllerAdvice
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(User.class) && parameter.hasParameterAnnotation(CurrentUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return webRequest.getAttribute("currentUser", RequestAttributes.SCOPE_REQUEST);
}
}
```
需要在 Spring Boot 的配置类中注册 `CurrentUserMethodArgumentResolver` 类:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new CurrentUserMethodArgumentResolver());
}
}
```
至此,一个简单的使用 Spring Boot 和 MyBatis Plus 实现 Token 校验的示例就完成了。当客户端发送请求时,需要在请求头中添加 `Authorization` 字段,值为 `Bearer <token>`,其中 `<token>` 为生成的 JWT。如果 token 校验成功,控制器中的 `@CurrentUser` 参数会自动填充当前用户信息。
阅读全文