前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot过滤器和拦截器的实现和区别

springboot过滤器和拦截器的实现和区别

作者头像
Java编程指南
发布2019-08-02 15:50:15
2K0
发布2019-08-02 15:50:15
举报
文章被收录于专栏:Java编程指南Java编程指南

前言

springmvc中有两种很普遍的AOP实现: 1.过滤器(Filter) 2.拦截器(Interceptor)

本篇面对的是一些刚接触springboot的人群: 所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别(一些复杂的功能我会之后发出文章,请记得关注)

Filter的简单实现

字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url 那么它能帮我们过滤什么呢? 那功能可就多了: 比如过拦截掉我们不需要的接口请求 修改请求(request)和响应(response)内容 完成CORS跨域请求等等

现在我们来实现一个简单的过滤器: 可以新建一个filter包,随着项目的扩大过滤器会越来越多 在这里我新建了一个TestFilter类,实现Filter接口

代码语言:javascript
复制
@Component@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")
public class TestFilter implements Filter{}

我们一步步来 1.@Component就是把这个类注入到IOC容器中 2.@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")说明这是一个web过滤器,它拦截的url为/Blogs,过滤器名字为blogsTest

下面贴出实现接口之后的三个重构方法:

代码语言:javascript
复制
@Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        System.out.printf("过滤器实现");
        filterChain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }

初始化(init)和摧毁(destroy)方法一般不会用到,具体使用看下源码便知 doFilter()是过滤器的核心 注意:在实现接口方法之后,我们要转换request和response类型至HttpServlet,否则接下去的操作可能会报错。 如果过滤通过,执行filterChain.doFilter(request,response); 说明这个url已经经过了我们的Filter 其他不要设置,我们执行看下结果:

可以看到,只需要一个类我们就实现了一个简单的过滤器

当然可以不用注解的方式,配置启动类

代码语言:javascript
复制
@Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        List<String> urlPatterns = new ArrayList<String>();

        TestFilter testFilter = new TestFilter();   
        urlPatterns.add("/Blogs");      
        filterRegistrationBean.setFilter(testFilter);       
        filterRegistrationBean.setUrlPatterns(urlPatterns);     

        return filterRegistrationBean;
    }

这也是可以的,本人其实还是比较推荐这种方式添加过滤器

Interceptor的简单实现

拦截器的实现比过滤器稍微复杂一点 我们同样可以新建一个interceptor包 在里面新建一个名为MyInterceptor的类

代码语言:javascript
复制
public class MyInterceptor implements HandlerInterceptor {}

这个类实现了HandleInterceptor接口 直接贴类代码,我会在代码中注释功能

代码语言:javascript
复制
public class MyInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.printf("preHandle被调用");
        return true;    
    }

    
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle被调用");
    }

    
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion被调用");
    }
}

它依次实现了三个方法 相比过滤器,拦截器还需要在springmvc中注入 所以我们打开启动类,写入以下代码

代码语言:javascript
复制
public class WarApplication {

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

    
    
    static class WebMvcConfigurer extends WebMvcConfigurerAdapter{
        
        public void addInterceptors(InterceptorRegistry registry){
            registry.addInterceptor(new MyInterceptor())    
                    .addPathPatterns("/Handles");        
        }
    }
}

这里我在/Handles这个url中进行拦截 代码写完了,来看下结果

当进入指定url时,我们执行到了拦截器 接下来就可以根据需求去使用拦截器了

区别

过滤器和拦截器非常相似,但是它们有很大的区别 最简单明了的区别就是过滤器可以修改request,而拦截器不能 过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境 拦截器可以调用IOC容器中的各种依赖,而过滤器不能 过滤器只能在请求的前后使用,而拦截器可以详细到每个方法 区别很多,大家可以去查下

总的来说

过滤器就是筛选出你要的东西,比如requeset中你要的那部分 拦截器在做安全方面用的比较多,比如终止一些流程 网上有一张图片很不错,这里拷过来给大家看一下

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java编程指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档