一。问题产生原因
拦截器加载时间在springcontext之前,也就是在Bean加载之前就已经加载了拦截器,此时拦截器中注入的Bean为null
二。解决方案
让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器
修改前拦截器如下
public class TotalInterceptor implements HandlerInterceptor {
@Autowired
RedisUtil redisUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
if (token != null){ //判断此次请求是否携带token
Object o = redisUtil.get(token);//这里会报错,空指针异常
if(o!=null){ //查看token是否合法
//更新 token 的有效时间
redisTemplate.expire(token,30, TimeUnit.MINUTES);
return true;
}else{//token不合法
return false;
}
}
else {//未携带token
return false;
}
}
修改前拦截器配置如下
@Configuration
public class TotalInterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptorRegistration =
registry.addInterceptor(new TotalInterceptor());
interceptorRegistration.addPathPatterns("/user/**");
}
}
拦截器不变,拦截器配置修改后如下
@Configuration
public class TotalInterceptorConfig implements WebMvcConfigurer {
@Bean
public TotalInterceptor getTotalInterceptor(){
return new TotalInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptorRegistration =
registry.addInterceptor(getTotalInterceptor());
interceptorRegistration.addPathPatterns("/user/**");
}
}