关于springboot项目的tomcat之url解码问题

本文讲述了在Spring Boot项目中遇到的URL编码导致的中文乱码问题。通过分析Tomcat的解析过程,作者发现配置`server.tomcat.uri-encoding`为`iso-8859-1`,并结合代码中使用相同编码进行URL编码和解码,可以解决不同编码请求的兼容问题。问题的关键在于`this.tmpValue.setCharset(charset)`步骤,配置为ISO-8859-1可以确保后期通过正确编码解码乱码。

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

最近遇到一个问题

spring-boot项目,收到对方get请求里面的中文,乱码。

get请求会经过url编码,里面的中文,同样也被转换,类似这样:

localhost:8080/callback/test?RetMsg=%B3%E4%D6%B5%CA%A7%B0%DC%A3%A1&Version=1.0

这串东西:%B3%E4%D6%B5%CA%A7%B0%DC%A3%A1 用gbk编码解出来就是“充值失败!”

用utf-8解出来就是乱码

因为对方是gbk编码,于是项目中配置一个 server.tomcat.uri-encoding: gbk

问题解决。

但是该项目并不是一个特定的项目,而是一个通用的项目,必须通过配置兼容各种编码,对于某一接入方来说是gbk,对于另外的接入方可能是utf-8

很明显,不能这样写死。

怎么办?

想到了在代码中处理,对乱码进行先url编码,再重新url解码

但是试了一些情况都没成功,比如上面举的那条例子,在配置文件中什么都不配置,然后用utf-8进行url编码或者iso-8859-1进行编码,再用本身的gbk编码&#x

你好!对于Spring Boot中文件名中文乱码的问题,你可以尝试以下几种解决方法: 1. 设置字符编码:在Spring Boot的配置文件application.properties或application.yml中添加以下配置: ``` spring.http.encoding.charset=UTF-8 spring.http.encoding.force=true ``` 这样可以确保请求和响应的字符编码都为UTF-8。 2. 使用URL编码:如果你将中文字符作为URL的一部分,可以使用URL编码来避免乱码问题。你可以使用`java.net.URLEncoder`类中的`encode()`方法对文件名进行编码,然后在处理文件时进行解码。 3. 设置Tomcat的字符编码:如果你使用的是内嵌的Tomcat容器,可以在启动类中进行配置。例如,在@SpringBootApplication注解标记的类中添加以下代码: ```java @Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> { connector.setUseBodyEncodingForURI(true); }); return factory; } ``` 这样可以确保Tomcat使用正确的字符编码处理URI。 4. 使用MultipartResolver进行文件上传:如果你在Spring Boot中进行文件上传,可以在配置类中添加MultipartResolver Bean,并设置默认字符编码为UTF-8。例如: ```java @Configuration public class WebConfig { @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("UTF-8"); return resolver; } } ``` 这样可以确保文件上传时使用正确的字符编码。 希望以上方法能够解决你的问题!如果还有其他疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值