Springboot写一个拦截器拦截所有,如果没有token就验证用户名与密码,然后签发一个token返回给前端,如果已经有token则检验是否是签发给当前用户的
时间: 2024-05-13 11:15:21 浏览: 6
好的,下面是SpringBoot拦截器的实现方式:
1. 首先创建一个拦截器类,实现HandlerInterceptor接口,重写其中的三个方法preHandle、postHandle、afterCompletion。其中preHandle方法在请求处理之前被调用,返回值为true则继续执行后面的请求处理,为false则不执行后面的请求处理。
```
public class TokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null) {
// 如果请求头中没有Authorization信息则直接返回
throw new UnauthorizedException("没有权限访问该资源");
}
if (!JwtUtil.verify(token)) {
// 如果验证token失败则返回
throw new UnauthorizedException("token验证失败");
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
```
2. 在配置类中配置拦截器,使用addInterceptors方法添加拦截器,并设置拦截器的拦截路径。
```
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
.addPathPatterns("/**");
}
}
```
3. 在方法中获取请求头中的token,如果没有则验证用户名和密码,如果验证通过则签发一个token并返回给前端。
```
@PostMapping("/login")
public ResponseData login(@RequestBody User user) {
User loginUser = userService.login(user.getUsername(), user.getPassword());
if (loginUser == null) {
throw new UnauthorizedException("用户名或密码错误");
}
String token = JwtUtil.sign(loginUser.getId(), loginUser.getUsername(), loginUser.getPassword());
return ResponseData.success(token);
}
```
4. 在验证token的方法中判断token是否是签发给当前用户的。
```
public static boolean verify(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username", getUsername(token))
.withClaim("password", getPassword(token))
.build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e) {
return false;
}
}
private static String getUsername(String token) {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("username").asString();
}
private static String getPassword(String token) {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("password").asString();
}
```
注意:在签发token时,可以把用户的一些信息加入到token中,比如id、用户名等,验证token时可以通过这些信息进行验证。