在 Spring MVC 框架中使用 Servlet 的 filter (用 DelegatingFilterProxy )

 

用 Spring 框架跟 Servlet 的 api 湊在一起使用的時候

總是會有許多問題發生...

將 filter 與 Spring MVC 湊合用也不例外

背景說明:

最近公司的開發案用了以前其他案子的 code 當原型

要我們去改

而且還是好幾包 project 湊在一起用

其中一個狀況是

有一包是用

servlet filter 來驗證 session ( servlet request 取得的 session ) 

我們要把這部分的 code 直接移過來套到現有 Spring MVC 框架專案裡面

 

解法:

Step1. web.xml 裡面要加上

<filter>
  <filter-name>YourFilterName</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>YourFilterName</filter-name>
  <url-pattern>/yourpath/*</url-pattern>
</filter-mapping>

如url 符合 /yourpath/* 的路徑打到 server 端

filter 就會發揮作用了

而 DelegatingFilterProxy 是做甚麼用的?

看下官方說明:

會偵測servlet filter (繼承 filter interface )  ,然後委派成 Spring 管理的 bean

在web.xml 支援初始化 filter , 設定 bean 的名字

( targetBeanName, 我想指的應該是filter被初始化成為bean後會被Spring以這個名字來管理,有空再去查細節

filter-name標籤中寫的YourFilterName就是, 在spring的設定檔中如果要將他初始化就要用YourFilterName去mapping)

 

Step2.

通常用 Spring MVC 時

在 web.xml 都會設定 contextConfigLocation

初始化 Spring 的配置文件

    <context-param>
	    <param-name>contextConfigLocation</param-name>	    
	    <param-value>
	    	/WEB-INF/springContext/yourConfig.xml
	    </param-value>
	</context-param>

此時就要找 yourConfig.xml 這個檔案去配置 filter 的 bean 才行

比如說像這樣

<bean name="YourFilterName" 
      class="com.package.filter.YourFilter">
</bean>

注意 bean的 name 要與 step1. 配置的 filter-name 一樣

(這就是 targetBeanName了)

P.S filter 的 code 就不附了, 記得要implements filter interface 就是

參考:

https://stackoverflow.com/questions/7882042/how-can-i-get-a-spring-bean-in-a-servlet-filter

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/DelegatingFilterProxy.html

https://blog.csdn.net/yangwenxue_admin/article/details/73647240