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;
}
注解:
- setencoding 解决请求/响应乱码;
- setforceencoding(true) 覆盖 tomcat 默认 iso-8859-1;
- addurlpatterns(“/*”) 全局生效;
- 最高优先级,保证后续过滤器拿到的就是 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 一行搞定
注解:
- 表单必须是 post;
- 隐藏字段 _method 的值就是真实 http 方法;
- 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) {
// 表单字段自动封装进 userform
userservice.update(id, form);
return "redirect:/users";
}
注解:
- 过滤器把 put 请求体解析成 map<string,string[]>;
- 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"));
}
}
注解:
- 任何地方都能拿到当前线程的 httpservletrequest;
- 适用于日志、审计、灰度路由。
05corsfilter —— 跨域通行证
关键词: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 飞起来
关键词: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% 流量!
注解:
- 计算响应体 md5 作为 etag;
- 客户端带 if-none-match 对比即可;
- 静态资源、报表接口效果最佳。
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;
}
注解:
- 自动重写 request.getscheme()、getservername();
- 解决 https 终止在 nginx 时,重定向变成 http 的尴尬。
08orderedrequestcontextfilter —— 顺序可控的 requestcontext
如果你写了 10+ 个自定义 filter,谁先谁后就是生命线。
默认优先级:request_wrapper_filter_max_order - 10000
想插队?直接实现 ordered 接口
09resourceurlencodingfilter —— 静态资源“带版本号”
关键词:缓存破坏、内容哈希、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 -->
注解:
- 文件内容变动 → 指纹变化 → 浏览器重新下载;
- 365 天强缓存,更新即发版,用户无感知。
到此这篇关于springboot中9个内置过滤器用法的完整指南的文章就介绍到这了,更多相关springboot内置过滤器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论