SpringBoot拦截器中使用RedisTemplate
最近在做项目的过程中需要在拦截器中注入RedisTemplate对象,结果发现一只空指针。
拦截器代码如下:
package com.moti.component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Description 登录拦截器:用于登录检查,权限控制
* @Author xw
* @Date 15:09 2020/2/26
* @Param * @param null
* @return
**/
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Autowired
private RedisTemplate redisTemplate;
/**
* 在目标方式执行之前执行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser==null){
//未登录,返回登录页面
response.sendRedirect("/u-cloud/");
return false;
}else {
//已登录,放行
return true;
}
}
}
仔细一想,拦截器在SpringContext初始化之前就执行了,Bean初始化之前它就执行了,所以它肯定是无法获取SpringIOC容器中的内容的。那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取就能解决这个问题啦。
package com.moti.config;
import com.moti.component.LoginHandlerInterceptor;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.util.unit.DataSize;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.servlet.MultipartConfigElement;
@Configuration
public class MvcConfig implements WebMvcConfigurer, ErrorPageRegistrar {
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大
factory.setMaxFileSize(DataSize.parse("1024000KB"));
/// 设置总上传数据总大小
factory.setMaxRequestSize(DataSize.parse("1024000KB"));
return factory.createMultipartConfig();
}
/**
* @Description 注册视图控制器
* @Author xw
* @Date 15:11 2020/2/26
* @Param [registry]
* @return void
**/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/temp-file").setViewName("temp-file");
registry.addViewController("/error400Page").setViewName("error/400");
registry.addViewController("/error401Page").setViewName("error/401");
registry.addViewController("/error404Page").setViewName("error/404");
registry.addViewController("/error500Page").setViewName("error/500");
}
/**
* 提前new出 防止redis失效
* @return
*/
@Bean
public LoginHandlerInterceptor getLoginHandlerInterceptor(){
return new LoginHandlerInterceptor();
}
/**
* @Description 注册登录拦截器 addPathPatterns() -> 拦截的请求 excludePathPatterns -> 不拦截的请求
* @Author xw
* @Date 15:10 2020/2/26
* @Param [registry]
* @return void
**/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns(
"/","/temp-file","/error400Page","/error401Page","/error404Page","/error500Page","/uploadTempFile","/admin","/sendCode","/loginByQQ","/login","/register","/file/share","/connection",
"/asserts/**","/**/*.css", "/**/*.js", "/**/*.png ", "/**/*.jpg"
,"/**/*.jpeg","/**/*.gif", "/**/fonts/*", "/**/*.svg");
}
/**
* @Description 配置错误页面
* @Author xw
* @Date 13:27 2020/3/11
* @Param [registry]
* @return void
**/
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage error400Page = new ErrorPage(HttpStatus.BAD_REQUEST, "/error400Page");
ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/error401Page");
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/error404Page");
ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error500Page");
registry.addErrorPages(error400Page,error401Page,error404Page,error500Page);
}
}
最主要的就是加入这段代码,并且添加拦截器的时候使用这个方法 而不是new拦截器
/**
* 提前new出 防止redis失效
* @return
*/
@Bean
public LoginHandlerInterceptor getLoginHandlerInterceptor(){
return new LoginHandlerInterceptor();
}