9个SpringBoot中的自带实用过滤器使用详解

 更新时间:2025年05月09日 08:10:24   作者:风象南  
在SpringBoot应用中,过滤器(Filter)是处理HTTP请求和响应的重要组件,SpringBoot自带了许多实用的过滤器,如字符编码,跨域请求,缓存控制等,下面我们就来看看它的具体使用吧

在SpringBoot应用中,过滤器(Filter)是处理HTTP请求和响应的重要组件,它们能在请求到达控制器前或响应返回客户端前进行拦截处理。

SpringBoot自带了许多实用的过滤器,如字符编码、跨域请求、缓存控制等。

1. CharacterEncodingFilter - 字符编码过滤器

CharacterEncodingFilter是SpringBoot中最常用的过滤器之一,它确保HTTP请求和响应使用正确的字符编码,避免出现乱码问题。

功能和配置

在SpringBoot应用中,该过滤器默认已启用,使用UTF-8编码。你可以通过以下属性进行自定义配置:

# application.properties
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
server.servlet.encoding.enabled=true

手动配置示例

@Bean
public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);
    
    FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(filter);
    registrationBean.addUrlPatterns("/*");
    registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return registrationBean;
}

实际应用:当你的应用需要处理多语言内容,特别是包含中文、日文、阿拉伯文等非ASCII字符时,此过滤器能确保数据在传输过程中不会出现乱码。

2. HiddenHttpMethodFilter - HTTP方法转换过滤器

HTML表单只支持GET和POST方法,但RESTful API通常需要PUT、DELETE等HTTP方法。HiddenHttpMethodFilter通过识别表单中的隐藏字段来模拟这些HTTP方法。

配置方式

# 默认是开启的,如需禁用可设置为false
spring.mvc.hiddenmethod.filter.enabled=true

使用示例

<form action="/users/123" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
    <button type="submit">删除用户</button>
</form>

上述表单提交后,过滤器将把POST请求转换为DELETE请求,路由到对应的删除处理方法。

@DeleteMapping("/users/{id}")
public String deleteUser(@PathVariable Long id) {
    userService.deleteUser(id);
    return "redirect:/users";
}

实际应用:当你构建不使用JavaScript的传统Web应用,而又希望遵循RESTful设计原则时,这个过滤器非常有用。

3. FormContentFilter - 表单内容过滤器

FormContentFilter允许处理非POST请求(如PUT、PATCH等)中的表单数据,使这些请求的表单数据能像POST请求一样被解析。

配置方式

spring.mvc.formcontent.filter.enabled=true

实际应用场景

当客户端需要通过PUT请求更新资源,并以表单形式提交数据时,该过滤器能确保SpringMVC正确解析请求数据。

@PutMapping("/users/{id}")
public String updateUser(@PathVariable Long id, UserForm form) {
    // 没有FormContentFilter时,form对象的属性将无法被正确填充
    userService.updateUser(id, form);
    return "redirect:/users";
}

4. RequestContextFilter - 请求上下文过滤器

RequestContextFilter创建并维护一个RequestContext对象,使其在整个请求处理过程中可用,便于访问特定于请求的信息。

主要功能

• 使Locale解析和主题解析可用于整个请求

• 允许在任何地方获取当前请求的信息

• 支持请求作用域的数据绑定

使用示例

@Component
public class RequestInfoService {
    
    public String getClientInfo() {
        ServletRequestAttributes attributes = 
            (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        
        return String.format("Client IP: %s, User-Agent: %s", 
                             request.getRemoteAddr(), 
                             request.getHeader("User-Agent"));
    }
}

实际应用:当你需要在非Controller组件(如Service层)中访问当前HTTP请求信息时,此过滤器提供的功能非常有用。

5. CorsFilter - 跨域资源共享过滤器

CorsFilter实现了跨域资源共享(CORS)规范,允许浏览器向不同域的服务器发送请求,解决同源策略的限制。

配置方式

@Bean
public CorsFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("https://example.com");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/api/**", config);
    
    return new CorsFilter(source);
}

也可通过属性配置:

spring.web.cors.allowed-origins=https://example.com
spring.web.cors.allowed-methods=GET,POST,PUT,DELETE
spring.web.cors.allowed-headers=Authorization,Content-Type
spring.web.cors.allow-credentials=true

实际应用:当你的前端应用和API部署在不同域名下时,如前端在example.com,API在api.example.com,CORS过滤器是必不可少的。

6. ShallowEtagHeaderFilter - ETag缓存过滤器

ShallowEtagHeaderFilter自动为HTTP响应添加ETag 头信息,帮助客户端实现高效的缓存策略,减少不必要的网络传输。

原理与配置

此过滤器通过计算响应内容的哈希值生成ETag,当客户端再次请求相同资源时,可以通过比对ETag决定是否返回304(Not Modified)状态码。

@Bean
public FilterRegistrationBean<ShallowEtagHeaderFilter> shallowEtagHeaderFilter() {
    FilterRegistrationBean<ShallowEtagHeaderFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new ShallowEtagHeaderFilter());
    registration.addUrlPatterns("/api/*");
    registration.setName("shallowEtagHeaderFilter");
    return registration;
}

使用效果

  • 首次请求:服务器返回完整内容和ETag
  • 后续请求:客户端发送If-None-Match头,服务器比较ETag值
  • 内容未变:返回304状态码,无响应体
  • 内容已变:返回200状态码和新内容

实际应用:当你的应用提供大量静态内容或不频繁变化的API响应时,此过滤器能显著减少带宽使用并提高响应速度。

7. ForwardedHeaderFilter - 转发头信息过滤器

在使用负载均衡器或反向代理时,ForwardedHeaderFilter能处理转发的头信息,确保应用能正确识别客户端的原始信息。

处理的头信息

• X-Forwarded-Host

• X-Forwarded-Port

• X-Forwarded-Proto

• X-Forwarded-Prefix

• X-Forwarded-For

配置示例

@Bean
public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
    FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new ForwardedHeaderFilter());
    registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return registration;
}

实际应用:当你的SpringBoot应用部署在Nginx或AWS ELB等反向代理后面时,此过滤器能确保生成的URL和重定向使用正确的协议、主机名和端口。

8. OrderedRequestContextFilter - 有序请求上下文过滤器

OrderedRequestContextFilterRequestContextFilter的扩展版本,实现了Ordered接口,使其在过滤器链中的执行顺序可以更精确控制。

与RequestContextFilter的区别

• 实现了Ordered接口

• 默认优先级为FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 10000

• 在SpringBoot应用中替代了普通的RequestContextFilter

使用场景

当你有多个过滤器,且它们之间存在依赖关系时,OrderedRequestContextFilter能确保在正确的时机执行请求上下文初始化。

9. ResourceUrlEncodingFilter - 资源URL编码过滤器

ResourceUrlEncodingFilter主要用于处理静态资源的版本化URL,特别是在使用资源指纹或版本策略时。

功能介绍

• 将资源路径转换为包含版本信息的URL

• 支持内容哈希或固定版本号

• 与ResourceUrlProvider协同工作

使用示例

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Bean
    public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
        return new ResourceUrlEncodingFilter();
    }
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("classpath:/static/")
                .setCachePeriod(3600)
                .resourceChain(true)
                .addResolver(new VersionResourceResolver()
                        .addContentVersionStrategy("/**"));
    }
}

在模板中使用:

<!-- Thymeleaf -->
<link rel="stylesheet" th:href="@{/resources/css/main.css}" rel="external nofollow" />

<!-- 渲染后可能变为 -->
<link rel="stylesheet" href="/resources/css/main-d41d8cd98f00b204e9800998ecf8427e.css" rel="external nofollow" />

实际应用:当你需要实现高效的前端资源缓存策略,特别是在部署新版本时确保用户获取最新资源而不受浏览器缓存影响时,此过滤器非常有用。

总结

在实际项目中,根据应用需求选择合适的过滤器,并正确配置它们的执行顺序,将极大地提升应用的质量和开发效率。

到此这篇关于9个SpringBoot中的自带实用过滤器使用详解的文章就介绍到这了,更多相关SpringBoot过滤器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程处理文件的示例详解

    Java多线程处理文件的示例详解

    在Java编程中,文件处理是一项常见的任务,为了提高文件处理的效率,我们可以使用多线程技术,本文将详细介绍如何使用Java多线程来处理文件,需要的可以参考下
    2024-12-12
  • 简单了解Spring Web相关模块运行原理

    简单了解Spring Web相关模块运行原理

    这篇文章主要介绍了简单了解Spring Web相关模块运行原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java花式解决'分割回文串 ii'问题详解

    Java花式解决'分割回文串 ii'问题详解

    最学习动态规划思想的路上,遇见了‘分割回文串问题’,如临大敌啊,题目听起来蛮简单,思考起来却也没那么容易,本文将为大家详细介绍几种解决分割回文串 ii问题的办法,需要的可以参考一下
    2021-12-12
  • Spring Cache原理解析

    Spring Cache原理解析

    Spring Cache是一个框架,它提供了基于注解的缓存功能,使得开发者可以很方便地将缓存集成到他们的应用程序中,这篇文章主要介绍了Spring Cache原理解析,需要的朋友可以参考下
    2024-05-05
  • Invalid bound statement(not found):错误的解决方案

    Invalid bound statement(not found):错误的解决方案

    本文介绍了在开发Java SpringBoot应用程序时出现的"Invalidboundstatement(notfound)"错误的原因及解决方法,该错误通常与MyBatis或其他持久化框架相关,可能是由于配置错误、拼写错误或其他问题引起的,解决方法包括检查SQL映射文件
    2025-01-01
  • SpringMVC 上传文件 MultipartFile 转为 File的方法

    SpringMVC 上传文件 MultipartFile 转为 File的方法

    这篇文章主要介绍了SpringMVC 上传文件 MultipartFile 转为 File的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • IDEA中JetBrains Mono字体的正确安装姿势

    IDEA中JetBrains Mono字体的正确安装姿势

    在 JetBrains Mono 的设计阶段,它就充分考虑到了长时间工作可能导致的眼睛疲劳问题,比如字母的大小和形状、空间量、自然等宽平衡、不必要的细节、连字、以及难以区分的符号等,从而最终设计出了这么一款字体
    2021-06-06
  • java操作PDF文件方法之转换、合成、切分

    java操作PDF文件方法之转换、合成、切分

    最近需要做⼀个把多个pdf报告合并成⼀个以⽅便预览的需求,下面这篇文章主要给大家介绍了关于java操作PDF文件方法之转换、合成、切分的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • RestTemplate请求失败自动重启机制精讲

    RestTemplate请求失败自动重启机制精讲

    这篇文章主要为大家介绍了RestTemplate请求失败自定义处理的方法,自动重试的机制精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多所进步,早日升职加薪
    2022-03-03
  • Java实现文件上传的两种方法(uploadify和Spring)

    Java实现文件上传的两种方法(uploadify和Spring)

    这篇文章主要为大家详细介绍了Java实现文件上传的两种方法,uploadify和Spring实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论