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

2025-05-10 14:50

本文主要是介绍9个SpringBoot中的自带实用过滤器使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《9个SpringBoot中的自带实用过滤器使用详解》在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设计原则时,这个过滤器非常有用。yjoVCszr

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();
    cChina编程onfig.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-Forwardjavascripted-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

使用场景

当你有多个过滤器,且它们之javascript间存在依赖关系时,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过滤器内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于9个SpringBoot中的自带实用过滤器使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154556

相关文章

Redis持久化机制之RDB与AOF的使用

《Redis持久化机制之RDB与AOF的使用》:本文主要介绍Redis持久化机制之RDB与AOF的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis持久化机制-RDB与AOF一、RDB持久化机制1、RDB简介2、RDB的工作原理3、RDB的优缺点4

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

使用Python实现实时金价监控并自动提醒功能

《使用Python实现实时金价监控并自动提醒功能》在日常投资中,很多朋友喜欢在一些平台买点黄金,低买高卖赚点小差价,但黄金价格实时波动频繁,总是盯着手机太累了,于是我用Python写了一个实时金价监控... 目录工具能干啥?手把手教你用1、先装好这些"食材"2、代码实现讲解1. 用户输入参数2. 设置无头浏

Spring Boot 常用注解详解与使用最佳实践建议

《SpringBoot常用注解详解与使用最佳实践建议》:本文主要介绍SpringBoot常用注解详解与使用最佳实践建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、核心启动注解1. @SpringBootApplication2. @EnableAutoConfi

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

Redis中RedisSearch使用及应用场景

《Redis中RedisSearch使用及应用场景》RedisSearch是一个强大的全文搜索和索引模块,可以为Redis添加高效的搜索功能,下面就来介绍一下RedisSearch使用及应用场景,感兴... 目录1. RedisSearch的基本概念2. RedisSearch的核心功能(1) 创建索引(2

Redis中HyperLogLog的使用小结

《Redis中HyperLogLog的使用小结》Redis的HyperLogLog是一种概率性数据结构,用于统计唯一元素的数量(基数),本文主要介绍了Redis中HyperLogLog的使用小结,感兴... 目录 一、HyperlogLog 是什么?️ 二、使用方法1. 添加数据2. 查询基数China编程3.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求