1、Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于 java本身的反射机制,这是两者最本质的区别。 2、Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调 doFilter方法。而interceptor与servlet容器无关,它主要在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。 3、Filter的过滤范围比Interceptor大,一个请求只有当他的url先通过了过滤器的校验后,才能再进入到该请求对应的action上下文中,再去执行对应的拦截器。Filter除了过滤请求外还可以过滤特殊字符,编码,文件等等, 而Interceptor只能拦截url请求。 4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 5、在action的生命周期中,拦截器可以多次被调用。而过滤器是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。 6、拦截器在Spring的配置文件中配置,而过滤器在web.xml中配置。
在web.xml中配置过滤器的配置:
<!--禁止缓存--> <filter> <filter-name>NoCacheFilter</filter-name> <filter-class>com.iom.filter.NoCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>NoCacheFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>NoCacheFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <!-- 特殊字符过滤器 --> <filter> <filter-name>illegalCharacterFilter</filter-name> <filter-class>com.iom.filter.IllegalCharacterFilter</filter-class> </filter> <filter-mapping> <filter-name>illegalCharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 用户权限过滤器 --> <filter> <filter-name>RolePowerFilter</filter-name> <filter-class>com.iom.filter.RolePowerFilter</filter-class> </filter> <filter-mapping> <filter-name>RolePowerFilter</filter-name> <!-- 这里表示对所有的以jsp后缀的文件有效,其它的无效 --> <url-pattern>*.jsp</url-pattern> </filter-mapping> 在spring配置文件中配置拦截器的配置: <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> <mvc:interceptors> <!-- session过期拦截器 --> <mvc:interceptor> <mvc:mapping path="/jsp/**"/> <!-- 以下请求不拦截 --> <mvc:exclude-mapping path="/jsp/get_company_list"/> <mvc:exclude-mapping path="/jsp/saveCompany"/> <mvc:exclude-mapping path="/jsp/clearCompany"/> <mvc:exclude-mapping path="/jsp/createCode"/> <mvc:exclude-mapping path="/jsp/validateCode"/> <bean class="com.iom.filter.SessionTimeoutInterceptor"/> </mvc:interceptor> <!-- Token校验拦截器 --> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.iom.filter.TokenInterceptor"/> </mvc:interceptor> </mvc:interceptors>