关于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装配。
 
 

发布了2 篇原创文章 · 获赞 3 · 访问量 1510

猜你喜欢

转载自blog.csdn.net/duke645/article/details/78949786