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

相关文章

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre

springboot整合mqtt的步骤示例详解

《springboot整合mqtt的步骤示例详解》MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,适用于物联网设备之间的通信,本文介绍Sprin... 目录1、引入依赖包2、yml配置3、创建配置4、自定义注解6、使用示例使用场景:mqtt可用于消息发

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点