当前位置: 代码网 > it编程>编程语言>Java > SpringBoot中9个内置过滤器用法的完整指南

SpringBoot中9个内置过滤器用法的完整指南

2025年08月12日 Java 我要评论
spring boot - 内置的9个过滤器用法01characterencodingfilter —— 乱码终结者关键词:utf-8、forceencoding、ordere

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内置过滤器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com