过滤器与拦截器的区别:
一、过滤器是Java EE体系中的,使用时需要在web.xml中配置节点;而拦截器是springMVC框架中的组件,使用时需要在spring的配置文件中进行配置(此处补充一点:字符编码过滤器不同于一般的过滤器,虽然使用时也是在web.xml中进行配置,但它是springmvc框架独有的组件,这点要注意!!!)。
二、过滤器是执行在所有的servlet之前,而拦截器是运行在DispatcherServlet之后,控制器之前的。
三、过滤器的过滤规则相对比较简单,只能通过节点配置它的适用范围;而拦截器的过滤规则相对比较灵活,既可以配置多项黑名单,还可以配置多项白名单。
1.过滤器的配置(此处已字符编码过滤器为例,其他过滤器配置方法类似):
<!-- 配置字符编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 过滤器 2-->
<filter>
<filter-name>...</filter-name>
<filter-class>...</filter-class>
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>...</filter-name>
<url-pattern>...</url-pattern>
</filter-mapping>
2.拦截器配置:
<mvc:interceptors>
<!-- 配置第1个拦截器 -->
<mvc:interceptor>
<!-- 1. 拦截的路径,即黑名单-->
<mvc:mapping path="/user/**" />
<mvc:mapping path="/main/index.do" />
<!-- 2. 例外的路径,不拦截的路径,即白名单-->
<mvc:exclude-mapping path="/user/reg.do" />
<mvc:exclude-mapping path="/user/handle_reg.do" />
<mvc:exclude-mapping path="/user/login.do" />
<mvc:exclude-mapping path="/user/handle_login.do" />
<!-- 3. 指定拦截器类 -->
<bean class="cn.demo.interceptor.LoginInterceptor" />
</mvc:interceptor>
<!-- 配置第2个拦截器 -->
<mvc:interceptor>
<!-- 1. 拦截的路径 ,即黑名单-->
<mvc:mapping path=".." />
<mvc:mapping path=".." />
<!-- 2. 例外的路径,不拦截的路径,即白名单-->
<mvc:exclude-mapping path=".." />
<mvc:exclude-mapping path=".." />
<mvc:exclude-mapping path=".." />
<mvc:exclude-mapping path=".." />
<!-- 3. 指定拦截器类 -->
<bean class=".." />
</mvc:interceptor>
</mvc:interceptors>
四、两者都需要创建一个类。过滤器需要实现Filter接口,在实现类中重写doFilter()方法,实现过滤功能;而拦截器需要实现HandlerInterCeptor接口,在实现类中重写preHandle()方法,实现拦截功能。
五、一个项目中可以同时配置多个过滤器和拦截器。过滤器的执行顺序是按在web.xml文件中的位置自上而下执行;拦截器的执行顺序也是按照在spring配置文件中的顺序自上而下执行,同类型的黑名单和白名单必须配置在同一个拦截器里面,而且是先配置黑名单再配置白名单。