用 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