当前位置: 首页 > news >正文

Spring Boot - 内置的9个过滤器用法

在这里插入图片描述

01CharacterEncodingFilter —— 乱码终结者

关键词:UTF-8、forceEncoding、Ordered.HIGHEST_PRECEDENCE

只要出现中文、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);// ④ 最先执行,防止其他过滤器捣蛋return bean;
}

注解:

  1. setEncoding 解决请求/响应乱码;
  2. setForceEncoding(true) 覆盖 Tomcat 默认 ISO-8859-1;
  3. addUrlPatterns(“/*”) 全局生效;
  4. 最高优先级,保证后续过滤器拿到的就是 UTF-8。

02HiddenHttpMethodFilter —— 把 POST 伪装成 PUT/DELETE

关键词: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 一行搞定
注解:

  1. 表单必须是 POST;
  2. 隐藏字段 _method 的值就是真实 HTTP 方法;
  3. Spring MVC 会自动路由到 @DeleteMapping。

03FormContentFilter —— PUT/PATCH 也能玩表单

关键词:application/x-www-form-urlencoded、非 POST 表单

spring.mvc.formcontent.filter.enabled: true # 同样一行配置
场景:老项目前端不会发 application/json,但接口想用 PUT 更新。

@PutMapping("/users/{id}")
public String updateUser(@PathVariable Long id, UserForm form) {// 表单字段自动封装进 UserFormuserService.update(id, form);return "redirect:/users";
}

注解:

  1. 过滤器把 PUT 请求体解析成 Map<String,String[]>;
  2. Spring 数据绑定无缝衔接。

04RequestContextFilter —— 随时随地拿 Request

关键词: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"));}
}

注解:

  1. 任何地方都能拿到当前线程的 HttpServletRequest;
  2. 适用于日志、审计、灰度路由。

05CorsFilter —— 跨域通行证

关键词:Access-Control-Allow-Origin、Credentials、预检

@Bean
public CorsFilter corsFilter() {CorsConfiguration cfg = new CorsConfiguration();cfg.setAllowCredentials(true);                // ① 允许携带 Cookiecfg.addAllowedOrigin("https://spa.xxx.com");  // ② 白名单域名cfg.addAllowedHeader("*");                    // ③ 任意请求头cfg.addAllowedMethod("*");                    // ④ 任意方法UrlBasedCorsConfigurationSource src = new UrlBasedCorsConfigurationSource();src.registerCorsConfiguration("/api/**", cfg);return new CorsFilter(src);
}

注解:

  1. 精准控制哪些接口、哪些域名可以跨域;
  2. 支持 Authorization 头与 Cookie;
  3. 比 @CrossOrigin 粒度更细,可集中管理。

06ShallowEtagHeaderFilter —— 让 304 飞起来

关键词:ETag、缓存、节省带宽

@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% 流量!

注解:

  1. 计算响应体 MD5 作为 ETag;
  2. 客户端带 If-None-Match 对比即可;
  3. 静态资源、报表接口效果最佳。

07ForwardedHeaderFilter —— 反向代理小棉袄

关键词: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;
}

注解:

  1. 自动重写 request.getScheme()、getServerName();
  2. 解决 HTTPS 终止在 Nginx 时,重定向变成 http 的尴尬。

08OrderedRequestContextFilter —— 顺序可控的 RequestContext

如果你写了 10+ 个自定义 Filter,谁先谁后就是生命线。

// 默认优先级:REQUEST_WRAPPER_FILTER_MAX_ORDER - 10000
// 想插队?直接实现 Ordered 接口

09ResourceUrlEncodingFilter —— 静态资源“带版本号”

关键词:缓存破坏、内容哈希、Thymeleaf 自动替换

@Configuration
public class WebCfg implements WebMvcConfigurer {@Beanpublic ResourceUrlEncodingFilter resourceUrlEncodingFilter() {return new ResourceUrlEncodingFilter();}@Overridepublic 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}" />
<!-- 实际输出:/static/css/app-8a9b2c3.css -->

注解:

  1. 文件内容变动 → 指纹变化 → 浏览器重新下载;
  2. 365 天强缓存,更新即发版,用户无感知。
http://www.xdnf.cn/news/1278199.html

相关文章:

  • Day 9-2: Transformer翻译实例演示 - 翻译的基础设施
  • AI大模型 教师方向应用探索
  • Audio Flamingo
  • 第4章 程序段的反复执行4 多重循环练习(题及答案)
  • Python day40
  • C++ list类
  • 【深度学习新浪潮】遥感图像风格化迁移研究工作介绍
  • JS中typeof与instanceof的区别
  • 腾讯云EdgeOne KV存储在游戏资源发布中的技术实践与架构解析
  • 数学建模——回归分析
  • 【GPT入门】第44课 检查 LlamaFactory微调Llama3的效果
  • 集成电路学习:什么是Parameter Server参数服务器
  • 机器学习-增加样本、精确率与召回率
  • Java开源代码源码研究:我的成长之路与实战心得分享
  • 学习分库分表的前置知识:高可用系统架构理论与实践
  • 构建企业级Odoo 18 WMS——功能、架构与拓展蓝图
  • LeetCode每日一题,2025-8-10
  • 《C语言》结构体和联合体练习题--2
  • 前端学习日记 - 前端函数防抖详解
  • 无人机集群协同三维路径规划,采用梦境优化算法(DOA)实现,Matlab代码
  • python魔法属性__doc__介绍
  • 区块链让物联网真正链接万物
  • Mysql系列--5、表的基本查询(上)
  • 【论文阅读】Deep Adversarial Multi-view Clustering Network
  • C语言:指针(2)
  • 基于ECharts的智慧社区数据可视化
  • Knuth‘s TwoSum Algorithm 原理详解
  • JS实现数组扁平化
  • 【C#补全计划】万类之父中的方法
  • Linux环境下实现简单TCP通信(c)