關於springboot請求攔截器中獲取不到bean的解決方式【轉載部分修改】
阿新 • • 發佈:2019-02-14
介紹:
在企業開發中無論是大的專案還是小的專案,所以的web介面都可能會遇到需要進行許可權驗證/登陸驗證/授權認證的攔截。我常用的做法就是將登陸資訊/許可權資訊存入redis,前端返回token,每次請求時進行驗籤;在進行驗籤時需要通過redis元件進行操作redis快取,因為其他地方也用到這個redis組織所以我將他注入到了spring容器中,但是到請求攔截髮現獲取不到這個redis元件,下面記錄一下解決方式留做筆記。
轉載部分:
攔截器部分
public class WebHandlerInterceptor implements HandlerInterceptor { Logger logger = LoggerFactory.getLogger(WebHandlerInterceptor.class); @Autowired IRedisService redisService; /** * controller 執行之前呼叫 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //請求攔截器 logger.info("-------------------------請求攔截器-------------------------"); String path = request.getServletPath(); logger.info(path); /* if(path !=null && path.contains("/login")){ logger.info("-------------------------不攔截-------------------------"); return true; }*/ String key = CookieUtil.getCookie(request); if(key == null){ logger.info("-------------------------key為null-------------------------"); response.setStatus(601); return false; } String value =redisService.get(key); if(value == null){ logger.info("-------------------------value為null-------------------------"); response.setStatus(601); return false; } logger.info("-------------------------登陸認證通過-------------------------"); return true; } /** * controller 執行之後,且頁面渲染之前呼叫 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //請求響應攔截器 logger.info("-------------------------請求響應攔截器-------------------------"); } /** * 頁面渲染之後呼叫,一般用於資源清理操作 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //頁面渲染攔截器 logger.info("-------------------------頁面渲染攔截器-------------------------"); } }
攔截器注入部分
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { private WebHandlerInterceptor webHandlerInterceptor = new WebHandlerInterceptor(); /** * 注入攔截器bean */ @Bean WebHandlerInterceptor webHandlerInterceptor(){ return webHandlerInterceptor; } /** * 註冊 攔截器 * .addPathPatterns("/seengene/**") 新增攔截路徑 * .excludePathPatterns("/seengene/login") 新增攔截排除路徑 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(webHandlerInterceptor).excludePathPatterns("/app/login"); } }
原創:獲取攔截器例項化物件 並將例項化物件注入到容器中,這個方式既能繼續使用攔截器
addInterceptors的重寫進行攔截規則設定,又能在攔截層進行bean裝配。