文章目录
概要
拦截器不能注入bean的问题原因和解决方案
例如:
拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤:
步骤1 自定义拦截器MyInterceptor :
package com.aiit.project.config;
import com.aiit.project.mapper.BlacklistMapper;
import com.aiit.project.model.entity.Blacklist;
import com.aiit.project.service.BlacklistService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.iflytek.uaac.client.rest.context.UaacServiceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
/**
* 拦截器
*/
//@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
.....
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
步骤 2 配置自定义拦截器:
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor ())
// 拦截的请求
.addPathPatterns("/**")
// 不用拦截的请求
.excludePathPatterns("/login");
}
}
问题
bean 没有被注入进来
在添加拦截器的时候用的是new MyInterceptor (),如果想要拦截器生效,必须将拦截器配置到WebMvc的配置类中,就是我们自定义的WebConfiguration类。现在添加拦截器的时候是 new 了一个拦截器,也就是说并没有将拦截器托管给IOC容器,所以就无法引入Spring的bean对象。
如果开启 @Component 同样无法注入bean, 原因是现在添加拦截器的时候是 new 了一个拦截器
所以就无法引入Spring的bean对象。
解决问题思路
将拦截器托管给IOC容器
1.在WebConfiguration注入拦截器
@Component
public class LoginInterceptor implements HandlerInterceptor {
}
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor);
}
}
2. 在WebConfiguration将拦截器注成bean
public class LoginInterceptor implements HandlerInterceptor {
}
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor( loginInterceptor());
}
}
3.通过构造器处理
public class LoginInterceptor implements HandlerInterceptor {
private TokenUtil tokenUtil;
public LoginInterceptor(TokenUtil tokenUtil) {
this.tokenUtil = tokenUtil;
}
}
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Autowired
private TokenUtil tokenUtil;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor(tokenUtil));
}
}