1. 程式人生 > >關於springboot請求攔截器中獲取不到bean的解決方式【轉載部分修改】

關於springboot請求攔截器中獲取不到bean的解決方式【轉載部分修改】

介紹:

在企業開發中無論是大的專案還是小的專案,所以的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裝配。