gpt4 book ai didi

浅谈SpringMVC中Interceptor和Filter区别

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 30 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章浅谈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 。

配置如下:

?
1
2
3
4
5
6
7
8
<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实现。代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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配置如下:

?
1
2
3
4
5
6
7
8
<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接口实现。代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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(),

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

最后此篇关于浅谈SpringMVC中Interceptor和Filter区别的文章就讲到这里了,如果你想了解更多关于浅谈SpringMVC中Interceptor和Filter区别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com