淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件
1.過濾器:
依賴于servlet容器。在實現(xiàn)上基于函數(shù)回調(diào),可以對幾乎所有請求進(jìn)行過濾,但是缺點是一個過濾器實例只能在容器初始化時調(diào)用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的數(shù)據(jù).
比如:在過濾器中修改字符編碼;在過濾器中修改 HttpServletRequest的一些參數(shù),包括:過濾低俗文字、危險字符等
關(guān)于過濾器的一些用法可以參考我寫過的這些文章:
繼承HttpServletRequestWrapper以實現(xiàn)在Filter中修改HttpServletRequest的參數(shù):https://www.zifangsky.cn/677.html
在SpringMVC中使用過濾器(Filter)過濾容易引發(fā)XSS的危險字符:https://www.zifangsky.cn/683.html
2.攔截器:
依賴于web框架,在SpringMVC中就是依賴于SpringMVC框架。在實現(xiàn)上基于Java的反射機(jī)制,屬于面向切面編程(AOP)的一種運(yùn)用。由于攔截器是基于web框架的調(diào)用.
因此可以使用spring的依賴注入(DI)進(jìn)行一些業(yè)務(wù)操作,同時一個攔截器實例在一個controller生命周期之內(nèi)可以多次調(diào)用。但是缺點是只能對controller請求進(jìn)行攔截,對其他的一些比如直接訪問靜態(tài)資源的請求則沒辦法進(jìn)行攔截處理。
關(guān)于攔截器的一些用法可以參考我寫過的這些文章:
SpringMVC中使用攔截器(interceptor)攔截CSRF攻擊(修):https://www.zifangsky.cn/671.html
SpringMVC中使用Interceptor+cookie實現(xiàn)在一定天數(shù)之內(nèi)自動登錄:https://www.zifangsky.cn/700.html
3.執(zhí)行順序
過濾器的運(yùn)行是依賴于servlet容器的,跟springmvc等框架并沒有關(guān)系。并且多個過濾器的執(zhí)行順序跟web.xml文件中定義的先后關(guān)系有關(guān)。
攔截器的執(zhí)行順序跟在SpringMVC的配置文件中定義的先后順序有關(guān)。
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>
到此這篇關(guān)于淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件的文章就介紹到這了,更多相關(guān)SpringMVC攔截器 Servlet過濾器 SpringMVC配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)發(fā)送短信驗證碼+redis限制發(fā)送的次數(shù)功能
這篇文章主要介紹了Java實現(xiàn)發(fā)送短信驗證碼+redis限制發(fā)送的次數(shù),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例
本文主要介紹了java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java抽象類、繼承及多態(tài)和適配器的實現(xiàn)代碼
這篇文章主要介紹了Java抽象類、繼承及多態(tài)和適配器的實現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-06-06關(guān)于IntelliJ IDEA 打包代碼報錯的問題
這篇文章主要介紹了關(guān)于IntelliJ IDEA 打包代碼報錯的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03SpringMVC獲取請求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼
這篇文章主要給大家介紹了SpringMVC獲取請求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2023-12-12interrupt()和線程終止方式_動力節(jié)點Java學(xué)院整理
線程的thread.interrupt()方法是中斷線程,將會設(shè)置該線程的中斷狀態(tài)位,即設(shè)置為true,中斷的結(jié)果線程是死亡、還是等待新的任務(wù)或是繼續(xù)運(yùn)行至下一步,就取決于這個程序本身2017-05-05