上篇 010 Spring Boot 拦截器 我们知道了在如何使用拦截器,本篇我们看下在拦截器中如何对 token 的校验,以及如何在拦截器中操作数据库。
1. 在拦截器中解析 token
我们使用拦截器其中一个作用就是对token进行校验检查,当然这一步也可以放到 controller 的基类中实现,但是我们一般在拦截器中实现:
在 010 Spring Boot 拦截器 代码基础上,重写 preHandle
方法:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("==========preHandle================");
// 从 http header 中获取 token
String token = request.getHeader("x-token");
if(token == null) { // 判断是否有 token 如果没有则抛出异常,终止运行
throw new JDZException(RtCode.ERR_NEED_TOKEN);
}
// 解析 token
TokenBuilder tokenBuilder = new TokenBuilder();
RtCode rtCode = tokenBuilder.parse(token);
if(rtCode != RtCode.SUCCESS) { // token 解析失败
throw new JDZException(rtCode);
}
// token 解析成功,继续往下执行
return true;
}
2. 在拦截器中操作数据库
上面的代码,完成了对 token 的解析操作,此时可以获取到 uid 和其他数据,但是我们还需要校验 uid 对应的用户是否存在(或访问权限等),这时我们就必须要进行数据库操作了。
我们在 controller 类中通过 service 对象来简洁操作数据库,service 对象是通过 @Autowired 方式注入的,是全局的单实例变量,而在拦截器中,是无法直接获取这个实例的,如果是 new 的话,那这个实例的内部数据源对象也就没值了。
我们对拦截器作如下修改:
1. 在定义拦截器时,把 service 对象注入:
private UserService userService;
public MyInterceptor(UserService userService) {
this.userService = userService;
}
2. 在拦截器配置文件中:
@Configuration
public class JDZInterceptorConfig implements WebMvcConfigurer {
@Autowired
UserService userService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor(userService))
.excludePathPatterns(ApiConfig.notNeedCheckToken);
}
}
这样,在拦截器中就可以使用 UserService,从而就可以来操作数据库了:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("==========preHandle================");
// 从 http header 中获取 token
String token = request.getHeader("x-token");
if(token == null) { // 判断是否有 token 如果没有则抛出异常,终止运行
throw new JDZException(RtCode.ERR_NEED_TOKEN);
}
// 解析 token
TokenBuilder tokenBuilder = new TokenBuilder();
RtCode rtCode = tokenBuilder.parse(token);
if(rtCode != RtCode.SUCCESS) { // token 解析失败
throw new JDZException(rtCode);
}
// token 解析成功,继续往下执行
User user = userService.getInfo(tokenBuilder.getUid());
if(user == null) { // 用户不在数据库中
throw new JDZException(RtCode.ERR_USER_NOT_EXIST);
}
return true;
}
源码:
- github: https://github.com/xiongxianhe/springboot/tree/master/011%20Spring%20Boot%20%E5%9C%A8%E6%8B%A6%E6%88%AA%E5%99%A8%E4%B8%AD%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93/javaapp
- gitee: https://gitee.com/null_186/springboot/tree/master/011%20Spring%20Boot%20%E5%9C%A8%E6%8B%A6%E6%88%AA%E5%99%A8%E4%B8%AD%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93/javaapp