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>
