Spring Boot項目中如何定製servlet-filters

本文首發於我的網站:Spring Boot項目中如何定製servlet-filtershtml

在實際的web應用程序中,常常須要在請求(request)外面增長包裝用於:記錄調用日誌、排除有XSS威脅的字符、執行權限驗證等等。除了上述提到的以外,Spring Boot自動添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,而且咱們在本身的項目中還能夠增長別的過濾器。java

Spring Boot、Spring Web和Spring MVC等其餘框架,都提供了不少servlet 過濾器可以使用,咱們須要在配置文件中定義這些過濾器爲bean對象。如今假設咱們的應用程序運行在一臺負載均衡代理服務器後方,所以須要將代理服務器發來的請求包含的IP地址轉換成真正的用戶IP。Tomcat 8 提供了對應的過濾器:RemoteIpFilter。經過將RemoteFilter這個過濾器加入過濾器調用鏈便可使用它。web

實戰

通常在寫簡單的例子時,不須要單獨定義配置文件,只須要將對應的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已經添加成功。spring

RemoteIPFilter

分析

項目的主類——BookPubApplication,能夠看到由@SpringBootApplication註解修飾,這包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解。在Spring Boot的自動配置、Command-line Runner一文中曾對這個三個註解作詳細解釋,@ComponentScan讓Spring Boot掃描到WebConfiguration類並把它加入到程序上下文中,所以,咱們在WebApplication中定義的Bean就跟在BookPubApplication中定義同樣。apache

方法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
相關文章
相關標籤/搜索