基于springboot拦截器HandlerInterceptor的注入问题

目录
  • springboot拦截器HandlerInterceptor的注入
    • 一、问题描述
    • 二、解决策略
    • 三、知识总结
  • springboot HandlerInterceptor 拦截器匹配规则写错 导致 拦截器无效
    • 拦截规则粟子

springboot拦截器HandlerInterceptor的注入

一、问题描述

项目启动后,拦截器下的注入为null,影响拦截器的逻辑操作。如下图:

二、解决策略

原因: 拦截器加载是在springcontext创建之前完成,详情可以看spring的拦截器加载过程及IOC的关系

解决方案一:使用@Bean在拦截器初始化之前让类加载,重点在于@Bean的拦截器处理及getCheckFilter()的引入

具体如下:

// 拦截器处理
public class CheckFilter implements HandlerInterceptor {
    @Autowired
    private SystemService systemService;
} 

// 配置类处理
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Bean
    public CheckFilter getCheckFilter(){
        return  new CheckFilter();
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getCheckFilter()).addPathPatterns("/**").
                excludePathPatterns("/admin/auth/**");
        super.addInterceptors(registry);
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }

    @Override
    protected void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/",".jsp");
        super.configureViewResolvers(registry);
    }
}

解决方案二:给拦截器增加配置注解如:@Configuration 、@Component 。在配置类中注入,具体如下操作:

// 拦截器处理
@Configuration   //或者 @Component
public class CheckFilter implements HandlerInterceptor {
    @Autowired
    private SystemService systemService;
} 

// 配置类处理
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Autowired
    private CheckFilter  checkFilter;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(checkFilter).addPathPatterns("/**").
                excludePathPatterns("/admin/auth/**");
        super.addInterceptors(registry);
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
 registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }

    @Override
    protected void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/",".jsp");
        super.configureViewResolvers(registry);
    }
}

三、知识总结

1、涉及spring的拦截器加载过程及IOC的管理

2、参考资料//www.jb51.net/article/223241.htm

springboot HandlerInterceptor 拦截器匹配规则写错 导致 拦截器无效

项目中发现拦截器无效,访问接口 /user/xxx/xxx 没有进入到拦截器中

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    @Autowired
    private UserInterceptor userInterceptor;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInterceptor).addPathPatterns("/user/*");
    }
}

原因是 拦截器的匹配规则弄错了。我希望 userInterceptor拦截器 拦截 /user/下所有路径的接口

正确拦截规则是 /user/**

拦截规则粟子

addPathPatterns("/**") 表示拦截所有的请求,

addPathPatterns("/**") 表示拦截所有的请求,

addPathPatterns("/test/**") 表示拦截/test/ 下的所有路径请求,

addPathPatterns("/test/*") 表示拦截/test/abc,拦截/test/aaa , 不拦截 /test/abc/def

addPathPatterns("/test/**").excludePathPatterns("/test/login", “/test/register”) 表示拦截/test/ 下的所有路径请求,但不拦截 /test/login 和 /test/register

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringBoot 解决拦截器注入Service为空问题

    一.自定义拦截器实现 HandlerInterceptor 接口 /** * * Created by zhh on 2018/04/20. */ public class MyInterceptor implements HandlerInterceptor { @Autowired private NetworkProxyInfoService networkProxyInfoService; @Override public void afterCompletion(HttpServlet

  • 关于SpringBoot拦截器中Bean无法注入的问题

    问题 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Bean无法注入是在拦截器中无效的问题,一直在查找注解指定的包在哪里配置的,然而却找不到配置,Springboot是用java类的形式加载配置的.在网络的某个角落看到这样的说法: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! "Applicati

  • springboot拦截器无法注入redisTemplate的解决方法

    在工作中我们经常需要做登录拦截验证或者其他拦截认证功能,基于springboot项目下我们很容易想到结合redis做的分布式拦截,把用户登录或者需要验证的信息放到redis里面.但是在写拦截器的时候发现redisTemplate一直无法注入进来,最后查资料才发现springboot拦截器是在Bean实例化之前执行的,所以Bean实例无法注入. 先看下问题,新建一个拦截器,然后注入redisTemplate /** * @author: lockie * @Date: 2019/8/13 16:1

  • SpringBoot的拦截器中依赖注入为null的解决方法

    该项目是基于SpringBoot框架的Maven项目. 今天在拦截器中处理拦截逻辑时需要使用注解调用其他方法 并且要从配置文件中读取参数.所以我使用了以下注解: @Reference CoreRedisService redisService; @Value("${channel}") private String channel; @Value("${allowMethod}") private String allowMethod; 一个是获取接口的引用,两外两

  • 基于springboot拦截器HandlerInterceptor的注入问题

    目录 springboot拦截器HandlerInterceptor的注入 一.问题描述 二.解决策略 三.知识总结 springboot HandlerInterceptor 拦截器匹配规则写错 导致 拦截器无效 拦截规则粟子 springboot拦截器HandlerInterceptor的注入 一.问题描述 项目启动后,拦截器下的注入为null,影响拦截器的逻辑操作.如下图: 二.解决策略 原因: 拦截器加载是在springcontext创建之前完成,详情可以看spring的拦截器加载过程及

  • SpringBoot拦截器的使用

    目录 一.拦截器简介 二.拦截器配置使用方式 1.过滤器拦截器作用范围 2.拦截器的使用 三.知识点总结 1.拦截器的使用 2.拦截器和过滤器的相同与不同 一.拦截器简介 拦截器通常通过动态代理的方式来执行. 拦截器的生命周期由IoC容器管理,可以通过注入等方式来获取其他Bean的实例,使用更方便. 二.拦截器配置使用方式 1.过滤器拦截器作用范围 2.拦截器的使用 示例代码如下: package com.rongrong.wiki.interceptor; import org.slf4j.L

  • SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景,这时你就需要获取 HTTP 请求的参数或者请求body,一般思路有两种,一种就是自定义个AOP去拦截目标方法,第二种就是使用拦截器.整体比较来说,使用拦截器更灵活些,因为每个接口的请求参数定义不同,使用AOP很难细粒度的获取到变量参数,本文主线是采用拦截器来获取HTTP请求. 1.2.定义拦截器获

  • SpringBoot 拦截器妙用你真的了解吗

    HandlerInterceptor 详解 HandlerInterceptor 允许定制 handler 处理器执行链的工作流接口.我们可以自定义拦截器用于拦截 handlers 处理器(你可以理解为 controller 层的接口),从而可以添加一些共同的重复性的处理行为(例如接口鉴权,接口日志记录,性能监控等),而不用修改每一个 handler 的实现. 注意,此基于 SpringBoot 2.3.12.RELEASE 版本讲解. HandlerInterceptor 接口只有三个默认空实

  • SpringBoot拦截器的使用介绍

    目录 定义拦截器 实现HandleInterceptor接口 继承HandleInterceptorAdapter类 实现WebRequestInterceptor接口 实现RequestInterceptor接口 小插曲 @Configuration和@Component区别 注册拦截器 继承WebMvcConfigurerAdapter类 继承WebMvcConfigurationSupport类 实现WebMvcConfigurer接口 应用场景 拦截器执行流程 单个拦截器 多个拦截器 总

  • SpringBoot拦截器的使用小结

    总结一下SpringBoot下拦截器的使用,步骤很简单: 1.自定义自己的拦截类,拦截类需要继承HandlerInterceptor接口并实现这个接口的方法. @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //方法调用前执行 return true;//返回

  • SpringBoot拦截器实现登录拦截的方法示例

    源码 GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-interceptor01 SpringBoot拦截器可以做什么 可以对URL路径进行拦截,可以用于权限验证.解决乱码.操作日志记录.性能监控.异常处理等 SpringBoot拦截器实现登录拦截 pom.xml: <?xml version="1.0" encoding="UTF-8"?> &

随机推荐