011 Spring Boot 在拦截器中操作数据库

上篇 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;
}

源码:

发表评论