SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件
1.过滤器:
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据.
比如:在过滤器中修改字符编码;在过滤器中修改 HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
关于过滤器的一些用法可以参考我写过的这些文章:
继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数:https://www.zifangsky.cn/677.html
在SpringMVC中使用过滤器(Filter)过滤容易引发XSS的危险字符:https://www.zifangsky.cn/683.html
2.拦截器:
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用.
因此可以使用spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
关于拦截器的一些用法可以参考我写过的这些文章:
SpringMVC中使用拦截器(interceptor)拦截CSRF攻击(修):https://www.zifangsky.cn/671.html
SpringMVC中使用Interceptor+cookie实现在一定天数之内自动登录:https://www.zifangsky.cn/700.html
3.执行顺序
过滤器的运行是依赖于servlet容器的,跟springmvc等框架并没有关系。并且多个过滤器的执行顺序跟web.xml文件中定义的先后关系有关。
拦截器的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。
SpringMVC的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans .......> <mvc:default-servlet-handler /> <context:component-scan base-package="com.netease.mmc.demo.web"> <!-- enable controller advice --> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> </context:component-scan> <context:component-scan base-package="com.netease.mmc.demo.imdemo.web"/> <context:annotation-config /> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.netease.mmc.demo.common.spring.interceptor.DDOSInterceptor"> <property name="close" value="false"/> <property name="maxRequest" value="2000"/> <property name="ttlSeconds" value="10"/> </bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.netease.mmc.demo.common.spring.interceptor.WebContextHolderInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/api/**"/> <bean class="com.netease.mmc.demo.web.interceptor.ValidateAppKeyInterceptor" /> </mvc:interceptor> </mvc:interceptors> <mvc:annotation-driven ignore-default-model-on-redirect="true"> <!-- message converters --> <mvc:message-converters> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" ref="objectMapper"/> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- view resolver --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="contentNegotiationManager" ref="contentNegotiationManager"/> <!-- api server has no page view resolvers, add viewResolvers config here if required --> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> <property name="objectMapper" ref="objectMapper"/> <property name="contentType" value="application/json;charset=UTF-8"/> <property name="modelKeys"> <set> <value>res</value> <value>msg</value> <value>errmsg</value> </set> </property> </bean> <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> <property name="marshaller" ref="xstreamMarshaller"/> <property name="modelKey" value="data"/> <property name="contentType" value="application/xml"/> </bean> </list> </property> </bean> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="mediaTypes"> <map> <entry key="json" value="application/json;charset=UTF-8"/> <entry key="xml" value="application/xml;charset=UTF-8"/> <entry key="html" value="text/html;charset=UTF-8"/> </map> </property> <property name="defaultContentType" value="application/json;charset=UTF-8"/> </bean> <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="serializationInclusion" value="NON_NULL" /> </bean> <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"> <property name="autodetectAnnotations" value="true" /> <property name="streamDriver"> <bean class="com.thoughtworks.xstream.io.xml.DomDriver" /> </property> </bean> <aop:aspectj-autoproxy/> </beans>