zoukankan      html  css  js  c++  java
  • SpringMVC中Interceptor和Filter区别

    Interceptor

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

    配置如下:

      <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();

    Filter和Interceptor的区别

    • Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
    • Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
    • Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
    • Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
    • 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

     

  • 相关阅读:
    VS2013 快捷键乱掉如何修改回来
    WCF契约之---服务契约 、数据契约、 消息契约
    成功的背后!(给所有IT人)----转载:来自CSDN第一名博主
    C# Attribute(特性)之---契约---[ServiceContract] 、 [OperationContract]
    SQL Server数据库连接字符串整理
    大写String和小写string的区别
    C#经典之Application.DoEvents()的使用
    C#实现多态之一抽象
    C# Attribute(特性)之---数据契约 [DataContract]
    Druid数据库连接池获取连接阻塞(转载)
  • 原文地址:https://www.cnblogs.com/rayallenbj/p/8484276.html
Copyright © 2011-2022 走看看