浅谈SpringMVC中Interceptor和Filter区别

网友投稿 771 2023-01-09


浅谈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启动是随WEywrxRJOkYGB应用的启动而启动,只需要初始化一次,以后都可以进行拦截。

Filter有如下几个种类:

用户授权Filter:检查用户请求,根据请求过滤用户非法请求;

日志Filter:记录某些特殊的用户请求;

http:// 解码Filter:对非标准编码的请求解码。

Filter和Interceptor的区别

Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于java反射的(AOP思想)。

Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。

Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。

Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。

在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。

Interceptor

配置如下:

//拦截所有请求

//拦截上面请求

一般拦截器可通过实现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配置如下:

http:// testFilter

cn.appsys.TestFilter

testFilter

/*

一般过滤器可通过实现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();


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自动化接口测试覆盖率意义(接口测试覆盖率一般是多少)
下一篇:子类继承父类实现接口吗(子类继承父类方法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~