浅谈SpringMVC中Interceptor和Filter区别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈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();
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

相关文档
最新文档