资讯专栏INFORMATION COLUMN

springboot(五)——springboot中的拦截器和过滤器小结

Magicer / 2110人阅读

摘要:而拦截器代理模式的实现基于反射,代理又分静态代理和动态代理,动态代理是拦截器的简单实现。如果是处理前后,既可以使用拦截器也可以使用过滤器,如果都使用了,注意前后顺序。

前言

关于过滤器Filter和拦截器Interceptor,大家都不会陌生,从一开始的servelet,到springmvc,再到现在的springboot,都有接触到,记得刚接触的时候,会容易弄混淆,想写这篇文章做个小的总结

拦截器和过滤器的异同

相同点

都是aop编程思想的体现,可以在程序执行前后做一些操作,如权限操作,日志记录等

不同点:

Filter是Servlet规范中定义的,拦截器是Spring框架中的

触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的

拦截器可以获取IOC容器中的各个bean,而过滤器就不行,拦截器归Spring管理

Springboot实现过滤器和拦截器

第一步:定义Filter

@Slf4j
public class TestFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        log.info("TestFilter filter。。。。。。。。");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

第二步:注入springboot容器当中

@Configuration
public class FilterConfig {

    @Bean
    Filter testFilter(){
        return new TestFilter();
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean1(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter((TestFilter) testFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        //filterRegistrationBean.setOrder();多个filter的时候order的数值越小 则优先级越高
        return filterRegistrationBean;
    }
}

第三步:定义拦截器

@Slf4j
@Service(value = "testInterceptor")
public class TestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("TestInterceptor preHandle....");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        log.info("TestInterceptor postHandle....");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        log.info("TestInterceptor afterCompletion....");
    }

}

第四步:加入springboot容器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Autowired
    TestInterceptor testInterceptor;

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

注意:这边用的springboot是2.0.x,采取的是直接实现WebMvcConfigurer,因为WebMvcConfigurerAdapter被标识了@Deprecated,就没有继承WebMvcConfigurerAdapter了

/** @deprecated */
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
    public WebMvcConfigurerAdapter() {
    }
}

第五步:还是启动之前的controller

@RestController
@RequestMapping("/api/test")
@Slf4j
public class TestController {

    @RequestMapping(value = "/hello")
    public String test() {
        log.info("test hello.............");
        return "SUCCESS";
    }

看到打印结果如下

2019-04-27/12:01:04.603||||||||^_^|[http-nio-8088-exec-1] INFO  com.stone.zplxjj.filter.TestFilter 22 - TestFilter filter。。。。。。。。
2019-04-27/12:01:04.612||||||||^_^|[http-nio-8088-exec-1] INFO  com.stone.zplxjj.interceptor.TestInterceptor 26 - TestInterceptor preHandle....
2019-04-27/12:01:04.634||||||||^_^|[http-nio-8088-exec-1] INFO  com.stone.zplxjj.interceptor.TestInterceptor 32 - TestInterceptor postHandle....
2019-04-27/12:01:04.634||||||||^_^|[http-nio-8088-exec-1] INFO  com.stone.zplxjj.interceptor.TestInterceptor 37 - TestInterceptor afterCompletion....
小结

过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理又分静态代理和动态代理,动态代理是拦截器的简单实现。那何时使用拦截器?何时使用过滤器?

如果是非spring项目,那么拦截器不能用,只能使用过滤器,这里说的拦截器是基于spring的拦截器。

如果是处理controller前后,既可以使用拦截器也可以使用过滤器,如果都使用了,注意前后顺序。

如果是处理dispaterServlet前后,只能使用过滤器。

更多文章可以关注公众号:stonezplxjj和个人博客:http://www.zplxjj.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74327.html

相关文章

  • Resultful API的拦截滤器——Filter)

    摘要:四过滤器拦截器切面起作用的顺序先是过滤器起作用然后拦截器起作用然后切面起作用最后进入方法中五当控制层即层的方法抛异常时,过滤器拦截器切面抛异常的顺序先是切面如果使用自定义异常再进入这个处理异常类然后拦截器然后过滤器如果都没处理,最后到 ...

    ckllj 评论0 收藏0
  • Resultful API的拦截(切片Aspect)

    摘要:目录一的拦截三种方式二切片的演示示例项目三切片特点四过滤器拦截器切面起作用的顺序五当控制层即层的方法抛异常时,过滤器拦截器切面抛异常的顺序一的拦截三种方式过滤器拦截器切片二切片的演示示例项目自定义一个名称为的切片,代码 ...

    huaixiaoz 评论0 收藏0
  • SpringBoot基础篇AOP之基本使用姿势小结

    摘要:通知和切点共同定义了关于切面的全部内容,它是什么时候,在何时和何处完成功能引入允许我们向现有的类添加新的方法或者属性组装方面来创建一个被通知对象。这可以在编译时完成例如使用编译器,也可以在运行时完成。和其他纯框架一样,在运行时完成织入。 原文:190301-SpringBoot基础篇AOP之基本使用姿势小结 一般来讲,谈到Spring的特性,绕不过去的就是DI(依赖注入)和AOP(切...

    timger 评论0 收藏0
  • 分享笔记:SpringBoot三种拦截服务【Filter,Interceptor,Aspect】

    摘要:拦截服务一使用第三方过滤器直接加入项目拦截服务二使用自定义拦截器拦截服务三使用切片完结 Spring拦截服务【一】(SpringBoot使用第三方过滤器Filter直接加入项目) Spring拦截服务【二】(SpringBoot使用自定义拦截器Interceptor) Spring拦截服务【三】(SpringBoot使用切片Aspect)【完结】

    qujian 评论0 收藏0
  • SpringBoot

    摘要:基于,支持后面的版本二基本使用网页生成访问生成项目并下载。这里的配置项可以自动提示。数据配置文件配置四整合映射跟之前一样注册注册拦截器五整合基本整合使用映射文件映射文件和注解同时存在注解引入配置文件增加事务六自动配置自动原理配置项 一、SpringBoot简介 1. 使用SSM开发项目的时候有什么不足之处 创建ssm项目比较麻烦 配置比较麻烦 依赖的配置比较多比较麻烦 手动集成第三方...

    mykurisu 评论0 收藏0

发表评论

0条评论

Magicer

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<