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

所属分类: 软件编程 / java 阅读数: 25
收藏 0 赞 0 分享

前言

springmvc中有两种很普遍的AOP实现:

1.过滤器(Filter)

2.拦截器(Interceptor)

本篇面对的是一些刚接触springboot的人群

所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别

(一些复杂的功能我会之后发出文章,请记得关注)

Filter的简单实现

字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url

那么它能帮我们过滤什么呢?

那功能可就多了:

比如过拦截掉我们不需要的接口请求

修改请求(request)和响应(response)内容

完成CORS跨域请求等等

现在我们来实现一个简单的过滤器:

可以新建一个filter包,随着项目的扩大过滤器会越来越多

在这里我新建了一个TestFilter类,实现Filter接口

@Component
@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")
public class TestFilter implements Filter{}

我们一步步来

1.@Component就是把这个类注入到IOC容器中

2.@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")说明这是一个web过滤器,它拦截的url为/Blogs,过滤器名字为blogsTest

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

@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

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

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

//过滤器
  @Bean
  public FilterRegistrationBean filterRegistrationBean(){
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    List<String> urlPatterns = new ArrayList<String>();
 
    TestFilter testFilter = new TestFilter();  //new过滤器
    urlPatterns.add("/Blogs");   //指定需要过滤的url
    filterRegistrationBean.setFilter(testFilter);    //set
    filterRegistrationBean.setUrlPatterns(urlPatterns);   //set
 
    return filterRegistrationBean;
  }

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

Interceptor的简单实现

拦截器的实现比过滤器稍微复杂一点

我们同样可以新建一个interceptor包

在里面新建一个名为MyInterceptor的类

public class MyInterceptor implements HandlerInterceptor {}

这个类实现了HandleInterceptor接口

直接贴类代码,我会在代码中注释功能

public class MyInterceptor implements HandlerInterceptor {
  //在请求处理之前进行调用(Controller方法调用之前
  @Override
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    System.out.printf("preHandle被调用");
    return true;  //如果false,停止流程,api被拦截
  }
 
  //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
  @Override
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle被调用");
  }
 
  //在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    System.out.println("afterCompletion被调用");
  }
}

它依次实现了三个方法

相比过滤器,拦截器还需要在springmvc中注入

所以我们打开启动类,写入以下代码

public class WarApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(WarApplication.class, args);
  }
 
  //mvc控制器
  //@Configuration
  static class WebMvcConfigurer extends WebMvcConfigurerAdapter{
    //增加拦截器
    public void addInterceptors(InterceptorRegistry registry){
      registry.addInterceptor(new MyInterceptor())  //指定拦截器类
          .addPathPatterns("/Handles");    //指定该类拦截的url
    }
  }
}

这里我在/Handles这个url中进行拦截

代码写完了,来看下结果

当进入指定url时,我们执行到了拦截器

接下来就可以根据需求去使用拦截器了

区别

过滤器和拦截器非常相似,但是它们有很大的区别

最简单明了的区别就是过滤器可以修改request,而拦截器不能

过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境

拦截器可以调用IOC容器中的各种依赖,而过滤器不能

过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

区别很多,大家可以去查下

总的来说

过滤器就是筛选出你要的东西,比如requeset中你要的那部分

拦截器在做安全方面用的比较多,比如终止一些流程

以上这篇详谈springboot过滤器和拦截器的实现及区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java基础之反射原理与用法详解

这篇文章主要介绍了Java基础之反射原理与用法,结合实例形式详细分析了java反射的相关概念、原理、使用方法与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

java字符串的截取方法substring()代码解析

这篇文章主要介绍了java字符串的截取方法substring()代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Mybatis一对多关联关系映射实现过程解析

这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java整数和字符串相互转化实例详解

这篇文章主要介绍了Java整数和字符串相互转化实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring Boot 项目设置网站图标的方法

这篇文章主要介绍了Spring Boot 项目设置网站图标的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java多态机制原理特点详解

在本篇文章里小编给大家分享的是关于java多态机制原理特点详解,有需要的朋友们可以跟着学习下。
收藏 0 赞 0 分享

Jmeter如何添加循环控制器

这篇文章主要介绍了Jmeter如何添加循环控制器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java虚拟机创建失败的原因整理

在本篇文章里小编给大家整理了关于创建java虚拟机失败的解决方法和知识点,需要的朋友们可以参考学习下。
收藏 0 赞 0 分享

Java如何把int类型转换成byte

这篇文章主要介绍了Java如何把int类型转换成byte,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

linux中java获取路径的实例代码

在本篇文章里小编给大家整理的是一篇关于linux中java获取路径的实例代码以及相关知识点,有兴趣的朋友们可以学习参考下。
收藏 0 赞 0 分享
查看更多