SpringBoot过滤器和Servlet3.0配置过滤器

首先启动类中加入@ServletComponentScan,进行扫描

@SpringBootApplication
@ServletComponentScan //过滤器注解 servlet 3.0
public class xxBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(xxBootApplication.class, args);
    }

}

新建一个类 实现  Filter  并且加上注解 @WebFilter 让他标记一个类为filter,被spring进行扫描 

@WebFilter(urlPatterns = "/" ,filterName = "LoginFilter") //urlPatterns  这里匹配拦截的规则 / 表示所有的拦截  可以指定到一个包下面的方法 
public class LoginFilter implements Filter {

    /*
    * 过滤器
    * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       if(){
          filterChain.doFilter(servletRequest,servletResponse); //放行
       }else{
          // 不放行
       }

    }
}
自定义拦截器 HandlerInterceptor
Spingboot2.x新版本配置拦截拦截器和旧版本SpringBoot配置拦截器区别讲解
    
    1、@Configuration
        继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本)
        SpringBoot2.X 新版本配置拦截器 implements WebMvcConfigurer
    2.自定义拦截器 HandlerInterceptor
        preHandle:调用Controller某个方法之前
        postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
        afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
    3.Filter
        是基于函数回调 doFilter(),而Interceptor则是基于AOP思想
        Filter在只在Servlet前后起作用,而Interceptor够深入到方法前后、异常抛出前后等

        依赖于Servlet容器即web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境。
    
        在接口调用的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
        
        Filter和Interceptor的执行顺序
         
        过滤前->拦截前->action执行->拦截后->过滤后
首先新建一个拦截的方法
 
public class LoginIntercepter implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.err.println("---->进入方法之前");
        return HandlerInterceptor.super.preHandle(request,response,handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.err.println("---->进入方法之中");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.err.println("----进入了方法之后");
    }
}

实现HandlerInterceptor  对里面的方法重写 然后在没一个里面对请求需要做的操作定义即可

然后新建一个类 定义拦截器 实现  WebMvcConfigurer  定义拦截的方法

@Configuration
public class WebMvcConfigurerTest implements WebMvcConfigurer {
    //自定义拦截器 对应的拦截到那些文件下的请求后转跳到  LoginIntercepter 方法中去对这次请求做先前操作
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/**");
    }
}

 拦截器不生效常见问题:
        1)是否有加@Configuration
        2)拦截路径是否有问题 **  和 * 
        3)拦截器最后路径一定要 “/**”, 如果是目录的话则是 /*/

发布了10 篇原创文章 · 获赞 0 · 访问量 514

猜你喜欢

转载自blog.csdn.net/DNCCCC/article/details/105031585