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

 更新时间:2025年08月12日 10:06:48   作者:小马不敲代码  
这篇文章主要为大家详细介绍了SpringBoot中9个内置过滤器用法的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一

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

相关文章

  • 解析SpringSecurity+JWT认证流程实现

    解析SpringSecurity+JWT认证流程实现

    这篇文章主要介绍了解析SpringSecurity+JWT认证流程实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 一文带你搞懂Java中Get和Post的使用

    一文带你搞懂Java中Get和Post的使用

    这篇文章主要为大家详细介绍了Java中Get和Post用法的相关资料,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11
  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)

    Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)

    这篇文章主要介绍了Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • java本服务如何调用本服务接口

    java本服务如何调用本服务接口

    这篇文章主要介绍了java本服务如何调用本服务接口问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 如何处理maven仓库中后缀LastUpdated文件

    如何处理maven仓库中后缀LastUpdated文件

    这篇文章主要介绍了如何处理maven仓库中后缀LastUpdated文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • SpringBoot整合quartz实现定时任务

    SpringBoot整合quartz实现定时任务

    这篇文章主要为大家详细介绍了SpringBoot如何整合quartz实现定时任务,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • 确保SpringBoot定时任务只执行一次的常见方法小结

    确保SpringBoot定时任务只执行一次的常见方法小结

    在Spring Boot项目中,确保定时任务只执行一次是一个常见的需求,这种需求可以通过多种方式来实现,以下是一些常见的方法,它们各具特点,可以根据项目的实际需求来选择最合适的方法,需要的朋友可以参考下
    2024-10-10
  • springBoot整合redis做缓存具体操作步骤

    springBoot整合redis做缓存具体操作步骤

    缓存主要是将数据存在计算机的内存当中,以便于在使用的时候是可以实现快速读取使用,它的快也是相对于硬盘读取而言,这篇文章主要给大家介绍了关于springBoot整合redis做缓存的具体操作步骤,需要的朋友可以参考下
    2024-04-04
  • selenium-java实现自动登录跳转页面方式

    selenium-java实现自动登录跳转页面方式

    利用Selenium和Java语言可以编写一个脚本自动刷新网页,首先,需要确保Google浏览器和Chrome-Driver驱动的版本一致,通过指定网站下载对应版本的浏览器和驱动,在Maven项目中添加依赖,编写脚本实现网页的自动刷新,此方法适用于需要频繁刷新网页的场景,简化了操作,提高了效率
    2024-11-11
  • java可以作为第一门编程语言学习吗

    java可以作为第一门编程语言学习吗

    在本篇内容里小编给JAVA零基础的网友分享一篇关于java可以作为第一门编程语言学习吗的文章,有兴趣的朋友们可以参考下。
    2020-11-11

最新评论