1. 程式人生 > 程式設計 >淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區別與聯絡 及SpringMVC 的配置檔案

淺談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>

到此這篇關於淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區別與聯絡 及SpringMVC 的配置檔案的文章就介紹到這了,更多相關SpringMVC攔截器 Servlet過濾器 SpringMVC配置檔案內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!