无论是filter还是interceptor都是无法使用自动注入获取属性的,无论是在拦截器类中注入还是在new的实例中有自动注入的属性都会报空值异常;
想在拦截器中使用自己的工具类或者其他ioc容器中的bean,可以在InterceptorConfiguration构建Interceptor时中填入属性值,因为在配置类中是可以使用自动注入的,具体的实现如下:
@Configuration//定义此类为配置类
public class LoginInterceptorConfig implements WebMvcConfigurer {
// 自动注入工具类
@Autowired
private RedisUtils redisUtils;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns拦截的路径
String[] addPathPatterns = {
"/book/**"
};
//excludePathPatterns排除的路径
String[] excludePathPatterns = {
"login.html","user/login"
};
//创建用户拦截器对象并指定其拦截的路径和排除的路径
// 在创建的时候填入注入的工具类
registry.addInterceptor(new CheckLoginInterceptor(redisUtils)).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
}
}
@Component
public class CheckLoginInterceptor implements HandlerInterceptor {
// 声明属性
private RedisUtils redisUtils;
// 创建有参构造方法
public CheckLoginInterceptor(RedisUtils redisUtils){
this.redisUtils=redisUtils;
}
// 重写在controller之前执行的方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
ServletContext servletContext = request.getServletContext();
Object uid1 = servletContext.getAttribute("uid");
System.out.println("uid1 = " + uid1);
if (uid1 != null) {
String uid = uid1.toString();
System.out.println("uid = " + uid);
User user = redisUtils.getUser(uid);
if (user != null) {
redisUtils.expire(uid);
return true;
}
} else {
servletContext.removeAttribute("uid");
request.getRequestDispatcher("/no_login.html").forward(request, response);
}
return false;
}
}