最近给SpringBoot(SpringMvc)添加拦截器的时候遇到了一个小坑,记录一下
一般给SpringMvc添加拦截器的时候我们首先想到了这种方式:
@Override
public void addInterceptors(InterceptorRegistry registry){
List<String> excludePath = new ArrayList<>();
//排除拦截,除了注册登录(此时还没token),其他都拦截
excludePath.add("/login"); //注册
excludePath.add("/static/**"); //静态资源
excludePath.add("/assets/**"); //静态资源
registry.addInterceptor(new TokenInterceptor())
.addPathPatterns("/**")
.excludePathPatterns(excludePath);
}
但是实际上这样不好使,应该是这里的TokenInterceptor是new出来的,不是从ioc容器中取出来的,所以userService这个bean取不到,值为null。
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
UserService userService;
@Autowired
TokenUtil tokenUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception{
...
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
...
正确做法应该这样,将tokenInterceptor注入容器再使用:
@Override
public void addInterceptors(InterceptorRegistry registry){
List<String> excludePath = new ArrayList<>();
//排除拦截,除了注册登录(此时还没token),其他都拦截
excludePath.add("/login"); //注册
excludePath.add("/static/**"); //静态资源
excludePath.add("/assets/**"); //静态资源
registry.addInterceptor(tokenInterceptor())
.addPathPatterns("/**")
.excludePathPatterns(excludePath);
}
@Bean
public TokenInterceptor tokenInterceptor() {
return new TokenInterceptor();
}