浅谈SpringMVC中Interceptor和Filter区别

 更新时间:2019年04月03日 09:53:24   作者:rayallenbj  
这篇文章主要介绍了浅谈SpringMVC中Interceptor和Filter区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Interceptor

主要作用:拦截用户请求,进行处理,比如判断用户登录情况、权限验证,只要针对Controller请求进行处理,是通过HandlerInterceptor。

Interceptor分两种情况,一种是对会话的拦截,实现spring的HandlerInterceptor接口并注册到mvc的拦截队列中,其中preHandle()方法在调用Handler之前进行拦截(上图步骤3),postHandle()方法在视图渲染之前调用(上图步骤5),afterCompletion()方法在返回相应之前执行;另一种是对方法的拦截,需要使用@Aspect注解,在每次调用指定方法的前、后进行拦截。

Filter

主要作用:过滤字符编码、做一些业务逻辑判断,主要用于对用户请求进行预处理,同时也可进行逻辑判断。

Filter在请求进入servlet容器执行service()方法之前就会经过filter过滤(上图步骤1),不像Intreceptor一样依赖于springmvc框架,只需要依赖于servlet。Filter启动是随WEB应用的启动而启动,只需要初始化一次,以后都可以进行拦截。

Filter有如下几个种类:

  • 用户授权Filter:检查用户请求,根据请求过滤用户非法请求;
  • 日志Filter:记录某些特殊的用户请求;
  • 解码Filter:对非标准编码的请求解码。

Filter和Interceptor的区别

  1. Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
  2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
  3. Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
  4. Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
  5. 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
  6. Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。

Interceptor

配置如下:

  <mvc:interceptors>
    <bean class="cn.appsys.testInterceptor"></bean>//拦截所有请求
    <mvc:interceptor>
      <mvc:mapping path="/manager/backend/**"/>
      <bean class="cn.appsys.interceptor.SysInterceptor"/>//拦截上面请求
    </mvc:interceptor>
    
  </mvc:interceptors>

一般拦截器可通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter实现。代码如下:

public class TestInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    System.out.println("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");
  }
}

preHandle是在请求到达Controller之前实现,可进行用户校验登录等操作,返回true后,请求到达Controller层;postHandle方法是在执行完Controller层代码之后,DispatcherServlet进行视图的渲染之前

执行,因此可以对ModelAndView 对象进行处理;afterCompletion方法是在DispatcherServlet进行视图的渲染之后执行调用,主要是进行一些资源清理等工作。

注:只能对Controller请求进行拦截,对一些静态资源无法拦截。

Filter

主要作用:统一设置字符集等。

依赖于servlet容器,过滤器实例只在初始化的时候调用一次。

过滤器在web.xml配置如下:

   <filter>
     <filter-name>testFilter</filter-name>
     <filter-class>cn.appsys.TestFilter</filter-class>
   </filter>
   <filter-mapping>
     <filter-name>testFilter</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>  

一般过滤器可通过实现Filter接口实现。代码如下:

public class TestFilter implements Filter {

  @Override
  public void destroy() {
    System.out.println("filter destroy");
  }

  @Override
  public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
      throws IOException, ServletException {
    System.out.println("filter doFilter before");
    arg2.doFilter(arg0, arg1);
    System.out.println("filter doFilter after");

  }

  @Override
  public void init(FilterConfig arg0) throws ServletException {
    System.out.println("filter init");
  }
}

拦截器和过滤器执行顺序:

1、Filter.init();
2、Filter.doFilter(); before doFilter
3、HandlerInterceptor.preHandle();
4、Controller方法执行
5、HandlerInterceptor.postHandle();
6、DispatcherServlet视图渲染
7、HandlerInterceptor.afterCompletion();
8、Filter.doFilter(); after doFilter
9、Filter.destroy();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java窗体动态加载磁盘文件的实现方法

    Java窗体动态加载磁盘文件的实现方法

    这篇文章主要介绍了Java窗体动态加载磁盘文件的实现方法,需要的朋友可以参考下
    2014-03-03
  • Java线程阻塞和唤醒的几种方式详解

    Java线程阻塞和唤醒的几种方式详解

    这篇文章主要介绍了Java线程阻塞和唤醒的几种方式详解,线程阻塞是指当一个线程无法继续执行时,它会进入阻塞状态,直到某个条件满足后才能继续执行,线程阻塞可以通过多种方式实现,如等待锁、等待IO操作、等待其他线程的完成等,需要的朋友可以参考下
    2023-10-10
  • SpringMVC参数传递之基本数据类型和复杂对象说明

    SpringMVC参数传递之基本数据类型和复杂对象说明

    这篇文章主要介绍了SpringMVC参数传递之基本数据类型和复杂对象说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 解决idea爆红 cant resolve symbol String的问题解析

    解决idea爆红 cant resolve symbol String的问题解析

    连着出差几个礼拜没有使用idea开发工具,突然一天打开电脑发现idea里的代码全部爆红,懵逼不如所措,很多朋友建议我按住Alt+回车设置jdk就能解决,但是仍然报错,经过几个小时的倒腾最终解决,遇到此问题的朋友参考下本文吧
    2021-06-06
  • JAVA线程同步实例教程

    JAVA线程同步实例教程

    这篇文章主要介绍了JAVA线程同步实例教程,在Java程序设计中有着非常广泛的应用,需要的朋友可以参考下
    2014-08-08
  • MyBatis与SpringMVC相结合实现文件上传、下载功能

    MyBatis与SpringMVC相结合实现文件上传、下载功能

    这篇文章主要介绍了MyBatis与SpringMVC相结合实现文件上传、下载功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响(推荐)

    Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响(推荐)

    这篇文章主要介绍了Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • JVM的基本介绍以及垃圾回收

    JVM的基本介绍以及垃圾回收

    垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露,这篇文章主要给大家介绍了关于JVM垃圾回收的相关资料,需要的朋友可以参考下
    2021-09-09
  • SpringBoot如何实现一个实时更新的进度条的示例代码

    SpringBoot如何实现一个实时更新的进度条的示例代码

    本文详细的介绍了SpringBoot如何实现一个实时更新的进度条,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • MyBatis主键自增的两种实现方法

    MyBatis主键自增的两种实现方法

    本文主要介绍了MyBatis主键自增的两种实现方法,主要包括注解方式或配置文件方式来实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01

最新评论