关于拦截器与过滤器的区别

对于拦截器和过滤器之间的区别之前没有很好的理解,在学习springSecurity时仔细看了一下,现在系统的来记录:
首先翻阅资料发现:
过滤器和拦截器的区别:
  **①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。**

于是自己做了一个测试:
新建web项目:InterceptorPSFilter(使用spring框架)

web.xml中写入:

    <!-- 过滤器  -->
     <filter>
       <filter-name>filter2</filter-name>
       <filter-class>com.cn.Filter1</filter-class>
     </filter>   
     <!-- url-pattern与哪个servlet路径一致,代表针对这个路径的请求都要进行过滤 -->
   <filter-mapping>
      <filter-name>filter2</filter-name>
      <url-pattern>*.do</url-pattern>
     </filter-mapping>

在spring的配置文件中写入:

    <!-- 配置拦截器组件 -->  
  <mvc:interceptors> 
    <mvc:interceptor> 
      <mvc:mapping path="/**"/>    
      <bean class="com.cn.Interceptor"/> 
    </mvc:interceptor> 
  </mvc:interceptors>  

在Filter1中写入:

public class Filter1 implements Filter{

    @Override
    public void destroy() {
        System.out.println("这是destory方法");

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        System.out.println("这是doFilter方法");
        arg2.doFilter(arg0, arg1);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("这是init方法");
    }

}

在Interceptor中写入:

public class Interceptor implements HandlerInterceptor{
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("这是afterCompletion方法");

    }
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
        System.out.println("这是postHandle方法");

    }
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2) throws Exception {
        System.out.println("这是preHandle方法");
        return true;
    }
}

在Comment中写入:

@Controller
@RequestMapping("/common")
public class Comment {
     @RequestMapping("/userInfo.do")
     public ModelAndView userInfo(HttpServletRequest request,
             HttpServletResponse response){
         System.out.println("到达controller这里");
        ModelAndView av = new ModelAndView("comment");      
        return av;

     }
}

运行项目,访问:
http://localhost:8080/InterceptorPSFilter/common/userInfo.do

会发现控制台输出:
这是init方法
八月 15, 2016 4:52:21 下午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring FrameworkServlet ‘springmvc’
八月 15, 2016 4:52:21 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler [“http-bio-8080”]
八月 15, 2016 4:52:21 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler [“ajp-bio-8009”]
八月 15, 2016 4:52:21 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 12348 ms
这是doFilter方法
这是preHandle方法
到达controller这里
这是postHandle方法
这是afterCompletion方法

结论: 拦截器是在spring中的,可以调用spring中的资源,
过滤器是在servlet容器中的,对于spring中的资源是不能调用的;解决方法可以使用代理的模式;
拦截器的运行 包含在 过滤器中;
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值