一个SpringSecurity引发的表单提交乱码问题

在Spring4.3.1 + SpringSecurity4.1.3项目中,使用Thymeleaf3.0.1时遇到表单提交中文字段出现乱码问题。尝试了修改HTML编码、检查工程文件编码、调整Thymeleaf和拦截器配置、修改Tomcat配置等方法均未解决问题。最终在StackOverflow找到解决方案,问题出在SpringSecurity的CsrfFilter上,需在它之前设置请求编码,以确保UTF-8编码生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    这个问题困扰了大半个下午,好久没遇到耗时这么久的问题了,所以还是值得一写的。

    最近在做一个工程,前后端交互用的是Spring4.3.1+SpringSecurity4.1.3+thymeleaf3.0.1,版本都比较新,总体还是比较愉快的。今天在做一个form的时候,有一个字段允许填写中文的,但输入中文后提交回显乱码。起初以为是数据库连接编码问题(今天刚换了本地的调试库),但打了个断点发现controller里拿到的对象的desc字段(就是允许输入中文的字段)已经是乱码了,而用

System.out.println(new String(desc.getBytes("iso-8859-1"), "UTF-8"));

这种方法又可以还原成中文。这就奇怪了。

 

    网上搜了下,说法大概有以下三种:

    1,html层面的问题。在页面头部加上<metahttp-equiv="Content-Type" content="text/html;charset=UTF-8">,以及在<form>里加上accept-charset="utf-8"(因为我有用thymeleaf,还试了th:accept-charset="utf-8"),都一样,没用。

 

    2,工程文件的编码问题。我用的是IJ,默认编码就开的UTF-8,前前后后都查了一遍,没用。

 

    3,thymeleaf和拦截器配置问题。这个我觉得是最可疑的,网上的说法是查以下几处(我是java配置方式,另有xml配置方式也可以在网上找到):

    模板解析器设置编码格式:

@Be
### Spring Security 中 UTF-8 编码问题及解决方案 在开发基于 Spring Boot 和 Spring Security 的应用程序时,可能会遇到与字符编码相关的问题,尤其是涉及中文或其他多字节字符的场景。以下是关于如何解决 Spring Security 中 UTF-8 编码问题的具体方法。 #### 配置文件中的字符集设置 为了确保应用能够正确处理 UTF-8 字符,在 `application.properties` 文件中应显式指定字符集的相关配置[^1]: ```properties spring.datasource.url=jdbc:mysql://192.168.88.128:3306/spring-security?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 ``` 上述配置通过 URL 参数设置了数据库连接使用的字符编码为 UTF-8 (`characterEncoding=utf-8`),从而避免因默认字符集不一致而导致的数据乱码问题。 #### Web 应用程序级别的字符集过滤器 除了数据源层面的配置外,还需要确保 HTTP 请求和响应均采用 UTF-8 编码。可以通过添加一个全局的字符集过滤器来实现这一点。具体做法是在项目的初始化类上注册 `CharacterEncodingFilter` 过滤器[^2]: ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.CharacterEncodingFilter; @Configuration public class WebConfig { @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("/*"); return registrationBean; } } ``` 此代码片段定义了一个强制使用 UTF-8 编码的过滤器,并将其应用于所有的请求路径(`/*`)。这一步对于防止前端提交表单或参数时发生编码错误至关重要。 #### 前后端交互中的编码一致性 当项目采用前后端分离架构时,需特别注意 API 接口返回 JSON 数据时的编码问题Spring Boot 默认会以 UTF-8 对 JSON 数据进行序列化输出,但如果客户端未正确解析,则可能导致显示异常。因此建议在接口文档中标明所有字符串字段均为 UTF-8 编码,并指导前端开发者按照该标准对接。 另外,如果使用的是较新的 Spring Boot 版本 (如 3.x),则需要注意其最低运行环境已升级至 Java 17 或更高版本[^3]。这意味着某些旧版依赖可能不再兼容,故而迁移过程中也应对潜在影响加以测试验证。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值