说说拦截器与过滤器

   最近突然被问起拦截器与过滤器的区别,一时回答的不是那么好的感觉,现在来记录一下,也重新回顾一下拦截器和过滤器的区别。如果部分内容有误,请指出,某些方面是基于本人(这里没有考虑Strust框架的问题)

我们都知道Tomcat是一个Servlet容器,内部顾名思义容纳Servlet,那么现在争执的 过滤器(Filter)与拦截器(Intercept)区别在于哪里?

引用:https://www.cnblogs.com/panxuejun/p/7715917.html

目录

结构图示

应用:     

 拦截器

过滤器

区别:

  1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。

           过滤器:

            拦截器:

2、拦截器不依赖servlet容器,过滤器依赖servlet容器。

3、过滤器可以拦截几乎所有的请求,拦截器不行

4、触发时机不一样


结构图示

应用:     

 拦截器

   在实现上基于Java的反射机制,属于面向切面(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理

          一般而言在此处可以对url等进行管理,与Cookies实现特定天数内自动登录,拦截CSRF攻击 等

过滤器

   在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作

       在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数等

 

区别:

  1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。

           过滤器:

                 为什么说过滤器是基于回调呢,下载源码后,进入其中一个实现类  MockFilterChain ,点入里面你会发现一个类似递归函数的调用,也就是里面的链式调用了一堆你设置的过滤器

		if (this.iterator.hasNext()) {
			Filter nextFilter = this.iterator.next();
			nextFilter.doFilter(request, response, this);
		}

		this.request = request;
		this.response = response;

处理完后 进入 PassThroughFilterChain 执行判断是否存在过滤器,如果没有进入Servlet

	/**
	 * Pass the call on to the Filter/Servlet.
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		if (this.filter != null) {
			this.filter.doFilter(request, response, this.nextFilterChain);
		}
		else {
			this.servlet.service(request, response);
		}
	}

 因此,我认为基于函数是这样来的,也这样,过滤器是在servlet外层,也就是拦截器的外层,这个点,Mark

            拦截器

     至于拦截器,基于框架这部分与基于AOP这两种说法也成,基于框架的话,例如我们调用Spring的 HandlerInterceptor 来实现我们需要的拦截器,或Strust也是很明显的,基于AOP自定义也是可以的,这两点我就不再与之重复描述

2、拦截器不依赖servlet容器,过滤器依赖servlet容器。

      这点通实现方式很明显可以看出,过滤器基于Servlet来实现,而拦截器可以通过框架与反射实现,并不依赖与容器本身

3、过滤器可以拦截几乎所有的请求,拦截器不行

       拦截器只拦截部分请求(不能拦截静态资源请求),过滤器可以

4、触发时机不一样

    过滤器包裹住servlet,servlet包裹住拦截器。从图示很明显看出 过滤器的触发时机是容器后,servlet之前。这部分通过上面的源码部分应该更清晰看出这个主线

        

猜你喜欢

转载自blog.csdn.net/CoffeeAndIce/article/details/83343056