出现情况:
在写博客项目时,要判断当前用户是否登录或是否已过期,所以实现了一个拦截器,注入redisUtil然后获取redis的用户登录信息,但明明redis中是存在数据的,还是一直获取为空。
出现原因:
拦截器在SpringContext初始化之前就执行了,即Bean初始化之前它就执行了,所以肯定是无法获取SpringIOC容器中的内容的。
解决办法
我们就让拦截器执行的时候实例化拦截器Bean:在配置类里面先实例化拦截器,然后在添加拦截器时获取已实例化的拦截器Bean即可。
/**
* @author zdk
* @date 2021/7/6 19:16
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 添加视图控制器
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
}
/**
* 提前实例化拦截器
* @return
*/
@Bean
public LoginHandlerInterceptor getLoginHandlerInterceptor(){
return new LoginHandlerInterceptor();
}
/**
* 添加拦截器时使用getLoginHandlerInterceptor获取已实例化的拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login.html","/","/user/userLogin","/user/toLogin")
.excludePathPatterns("/**/*.html", "/**/*.js", "/**/*.css", "/**/*.json", "/**/*.icon","/**/*.jpg","/**/*.png");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/");
}
}