SpringBoot中9個內(nèi)置過濾器用法的完整指南
Spring Boot - 內(nèi)置的9個過濾器用法

01CharacterEncodingFilter —— 亂碼終結(jié)者
關(guān)鍵詞:UTF-8、forceEncoding、Ordered.HIGHEST_PRECEDENCE
只要出現(xiàn)中文、emoji、阿拉伯文,就用它!
@Bean
public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8"); // ① 指定編碼
filter.setForceEncoding(true); // ② 強制覆蓋已有編碼
FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>(filter);
bean.addUrlPatterns("/*"); // ③ 攔截所有請求
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);// ④ 最先執(zhí)行,防止其他過濾器搗蛋
return bean;
}
注解:
- setEncoding 解決請求/響應亂碼;
- setForceEncoding(true) 覆蓋 Tomcat 默認 ISO-8859-1;
- addUrlPatterns(“/*”) 全局生效;
- 最高優(yōu)先級,保證后續(xù)過濾器拿到的就是 UTF-8。
02HiddenHttpMethodFilter —— 把 POST 偽裝成 PUT/DELETE
關(guān)鍵詞:RESTful、_method、HTML 表單
<form action="/books/7" method="post"> <input type="hidden" name="_method" value="DELETE"/> <button type="submit">刪除圖書</button> </form>
spring.mvc.hiddenmethod.filter.enabled=true # application.yml 一行搞定
注解:
- 表單必須是 POST;
- 隱藏字段 _method 的值就是真實 HTTP 方法;
- Spring MVC 會自動路由到 @DeleteMapping。
03FormContentFilter —— PUT/PATCH 也能玩表單
關(guān)鍵詞:application/x-www-form-urlencoded、非 POST 表單
spring.mvc.formcontent.filter.enabled: true # 同樣一行配置
場景:老項目前端不會發(fā) application/json,但接口想用 PUT 更新。
@PutMapping("/users/{id}")
public String updateUser(@PathVariable Long id, UserForm form) {
// 表單字段自動封裝進 UserForm
userService.update(id, form);
return "redirect:/users";
}
注解:
- 過濾器把 PUT 請求體解析成 Map<String,String[]>;
- Spring 數(shù)據(jù)綁定無縫銜接。
04RequestContextFilter —— 隨時隨地拿 Request
關(guān)鍵詞:RequestContextHolder、非 Controller 取 IP
@Service
public class ClientInfoService {
public String whoami() {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest req = attrs.getRequest();
return String.format("IP: %s, UA: %s",
req.getRemoteAddr(),
req.getHeader("User-Agent"));
}
}
注解:
- 任何地方都能拿到當前線程的 HttpServletRequest;
- 適用于日志、審計、灰度路由。
05CorsFilter —— 跨域通行證
關(guān)鍵詞:Access-Control-Allow-Origin、Credentials、預檢
@Bean
public CorsFilter corsFilter() {
CorsConfiguration cfg = new CorsConfiguration();
cfg.setAllowCredentials(true); // ① 允許攜帶 Cookie
cfg.addAllowedOrigin("https://spa.xxx.com"); // ② 白名單域名
cfg.addAllowedHeader("*"); // ③ 任意請求頭
cfg.addAllowedMethod("*"); // ④ 任意方法
UrlBasedCorsConfigurationSource src = new UrlBasedCorsConfigurationSource();
src.registerCorsConfiguration("/api/**", cfg);
return new CorsFilter(src);
}
注解:
- 精準控制哪些接口、哪些域名可以跨域;
- 支持 Authorization 頭與 Cookie;
- 比 @CrossOrigin 粒度更細,可集中管理。
06ShallowEtagHeaderFilter —— 讓 304 飛起來
關(guān)鍵詞:ETag、緩存、節(jié)省帶寬
@Bean
public FilterRegistrationBean<ShallowEtagHeaderFilter> etag() {
FilterRegistrationBean<ShallowEtagHeaderFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new ShallowEtagHeaderFilter());
bean.addUrlPatterns("/static/*", "/api/report/*");
return bean;
}
第一次 200 + ETag,第二次 304,直接省 80% 流量!
注解:
- 計算響應體 MD5 作為 ETag;
- 客戶端帶 If-None-Match 對比即可;
- 靜態(tài)資源、報表接口效果最佳。
07ForwardedHeaderFilter —— 反向代理小棉襖
關(guān)鍵詞:X-Forwarded-Proto、Nginx、ELB、HTTPS
@Bean
public FilterRegistrationBean<ForwardedHeaderFilter> forwarded() {
FilterRegistrationBean<ForwardedHeaderFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new ForwardedHeaderFilter());
bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 越早越好
return bean;
}
注解:
- 自動重寫 request.getScheme()、getServerName();
- 解決 HTTPS 終止在 Nginx 時,重定向變成 http 的尷尬。
08OrderedRequestContextFilter —— 順序可控的 RequestContext
如果你寫了 10+ 個自定義 Filter,誰先誰后就是生命線。
默認優(yōu)先級:REQUEST_WRAPPER_FILTER_MAX_ORDER - 10000
想插隊?直接實現(xiàn) Ordered 接口
09ResourceUrlEncodingFilter —— 靜態(tài)資源“帶版本號”
關(guān)鍵詞:緩存破壞、內(nèi)容哈希、Thymeleaf 自動替換
@Configuration
public class WebCfg implements WebMvcConfigurer {
@Bean
public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
return new ResourceUrlEncodingFilter();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
.resourceChain(true)
.addResolver(new VersionResourceResolver()
.addContentVersionStrategy("/**")); // ① 哈希指紋
}
}
Thymeleaf 模板:
<link rel="stylesheet" th:href="@{/static/css/app.css}" rel="external nofollow" />
<!-- 實際輸出:/static/css/app-8a9b2c3.css -->
注解:
- 文件內(nèi)容變動 → 指紋變化 → 瀏覽器重新下載;
- 365 天強緩存,更新即發(fā)版,用戶無感知。
到此這篇關(guān)于SpringBoot中9個內(nèi)置過濾器用法的完整指南的文章就介紹到這了,更多相關(guān)SpringBoot內(nèi)置過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析SpringSecurity+JWT認證流程實現(xiàn)
這篇文章主要介紹了解析SpringSecurity+JWT認證流程實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
Spring boot + mybatis + Vue.js + ElementUI 實現(xiàn)數(shù)據(jù)的增刪改查實例代碼(一)
這篇文章主要介紹了Spring boot + mybatis + Vue.js + ElementUI 實現(xiàn)數(shù)據(jù)的增刪改查實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05
java本服務(wù)如何調(diào)用本服務(wù)接口
這篇文章主要介紹了java本服務(wù)如何調(diào)用本服務(wù)接口問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
SpringBoot整合quartz實現(xiàn)定時任務(wù)
這篇文章主要為大家詳細介紹了SpringBoot如何整合quartz實現(xiàn)定時任務(wù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-10-10
確保SpringBoot定時任務(wù)只執(zhí)行一次的常見方法小結(jié)
在Spring Boot項目中,確保定時任務(wù)只執(zhí)行一次是一個常見的需求,這種需求可以通過多種方式來實現(xiàn),以下是一些常見的方法,它們各具特點,可以根據(jù)項目的實際需求來選擇最合適的方法,需要的朋友可以參考下2024-10-10
selenium-java實現(xiàn)自動登錄跳轉(zhuǎn)頁面方式
利用Selenium和Java語言可以編寫一個腳本自動刷新網(wǎng)頁,首先,需要確保Google瀏覽器和Chrome-Driver驅(qū)動的版本一致,通過指定網(wǎng)站下載對應版本的瀏覽器和驅(qū)動,在Maven項目中添加依賴,編寫腳本實現(xiàn)網(wǎng)頁的自動刷新,此方法適用于需要頻繁刷新網(wǎng)頁的場景,簡化了操作,提高了效率2024-11-11

