1. 程式人生 > 程式設計 >Spring Boot專案中如何定製servlet-filters

Spring Boot專案中如何定製servlet-filters

本文首發於個人網站:Spring Boot專案中如何定製servlet-filters

在實際的web應用程式中,經常需要在請求(request)外面增加包裝用於:記錄呼叫日誌、排除有XSS威脅的字元、執行許可權驗證等等。除了上述提到的之外,Spring Boot自動添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,並且我們在自己的專案中還可以增加別的過濾器。

Spring Boot、Spring Web和Spring MVC等其他框架,都提供了很多servlet 過濾器可使用,我們需要在配置檔案中定義這些過濾器為bean物件。現在假設我們的應用程式執行在一臺負載均衡代理伺服器後方,因此需要將代理伺服器發來的請求包含的IP地址轉換成真正的使用者IP。Tomcat 8 提供了對應的過濾器:RemoteIpFilter

。通過將RemoteFilter這個過濾器加入過濾器呼叫鏈即可使用它。

實戰

一般在寫簡單的例子時,不需要單獨定義配置檔案,只需要將對應的bean物件定義在Application類中即可。正式的專案中一般會有單獨的web配置檔案,我們在專案的com.test.bookpub(與BookpubApplication.java同級)下建立WebConfiguration.java檔案,並用@Configuration註解修飾。

package com.test.bookpub;

import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration; @Configuration public class WebApplication { @Bean public RemoteIpFilter remoteIpFilter() { return new RemoteIpFilter(); } } 複製程式碼

通過mvn spring-boot:run啟動專案,可以在終端中看到如下的輸出資訊,證明RemoteIPFilter已經新增成功。

RemoteIPFilter

分析

專案的主類——BookPubApplication,可以看到由@SpringBootApplication註解修飾,這包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解。在

Spring Boot的自動配置、Command-line Runner一文中曾對這個三個註解做詳細解釋,@ComponentScan讓Spring Boot掃描到WebConfiguration類並把它加入到程式上下文中,因此,我們在WebApplication中定義的Bean就跟在BookPubApplication中定義一樣。

方法public RemoteIpFilter remoteIpFilter() { ... }返回一個RemoteIPFilter類的spring bean。當Spring Boot監測到有javax.servlet.Filter的bean時就會自動加入過濾器呼叫鏈。從上圖中還可以看到,該Spring Boot專案一次加入了這幾個過濾器:characterEncodingFilter(用於處理編碼問題)、hiddenHttpMethodFilter(隱藏HTTP函式)、httpPutFormContentFilter、requestContextFilter(請求上下文),以及我們剛才自定義的RemoteIPFilter。

所有過濾器的呼叫順序跟新增的順序相反,過濾器的實現是責任鏈模式,具體的原理分析可以參考:責任鏈模式

Spring Boot 1.x系列

  1. Spring Boot的自動配置、Command-line-Runner
  2. 瞭解Spring Boot的自動配置
  3. Spring Boot的@PropertySource註解在整合Redis中的使用
  4. Spring Boot專案中如何定製HTTP訊息轉換器
  5. Spring Boot整合Mongodb提供Restful介面
  6. Spring中bean的scope
  7. Spring Boot專案中使用事件派發器模式
  8. Spring Boot提供RESTful介面時的錯誤處理實踐
  9. Spring Boot實戰之定製自己的starter
  10. Spring Boot專案如何同時支援HTTP和HTTPS協議
  11. 自定義的Spring Boot starter如何設定自動配置註解
  12. Spring Boot專案中使用Mockito
  13. 在Spring Boot專案中使用Spock測試框架
  14. Spring Boot專案中如何定製攔截器
  15. Spring Boot專案中如何定製PropertyEditors
  16. Spring Boot構建的Web專案如何在服務端校驗表單輸入
  17. Spring Boot應用的健康監控

本號專注於後端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這裡有所收穫。

javaadu