Spring Boot 获取入参中文变成了URL编码

在Web开发中,我们经常需要处理URL参数。当参数中包含中文字符时,它们会被自动编码,以便安全传输和正确解析。在Spring Boot中,默认情况下,入参中的中文字符会被转换成URL编码。本文将介绍如何使用Spring Boot解决这个问题,并提供相关代码示例。

URL 编码的概念

URL编码是一种将特殊字符转换成一系列%XX(XX为十六进制数)形式的编码方式。这是为了确保URL中的特殊字符被正确解析和传输。例如,将中文字符“你好”编码为URL编码后,结果为:%E4%BD%A0%E5%A5%BD。

Spring Boot 默认的 URL 编码行为

默认情况下,Spring Boot会自动将入参中的中文字符转换成URL编码。这是由于Spring Boot使用了URLEncoder类来处理URL参数,以达到安全传输和正确解析的目的。这种默认行为适用于大部分情况,但在某些场景下可能会造成不便。

如何禁用 URL 编码

如果我们希望禁用URL编码,以便保留中文字符的原始形式,可以通过修改Spring Boot的配置文件来实现。具体来说,我们需要修改application.properties(或application.yml)文件,添加以下配置:

spring.mvc.url-encoding.charset=UTF-8
spring.mvc.url-encoding.enabled=false

上述配置中,spring.mvc.url-encoding.charset用于指定字符编码方式,这里我们选择了UTF-8(常见的字符编码方式)。spring.mvc.url-encoding.enabled用于启用或禁用URL编码,默认为true。

代码示例

接下来,我们通过一个简单的Spring Boot应用程序来演示URL编码的影响以及如何禁用URL编码。

首先,我们创建一个Controller,用于接收URL参数并返回结果:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(@RequestParam("name") String name) {
        return "Hello " + name;
    }
}

在默认配置下,如果我们访问/hello?name=你好,Spring Boot会将参数中的中文字符转换成URL编码。例如,返回结果为Hello %E4%BD%A0%E5%A5%BD

接下来,我们将禁用URL编码。在application.properties文件中添加以下配置:

spring.mvc.url-encoding.charset=UTF-8
spring.mvc.url-encoding.enabled=false

重新启动应用程序,并再次访问/hello?name=你好。这次,返回结果为Hello 你好,中文字符保留了原始形式。

类图

下面是HelloController的类图:

classDiagram
    class HelloController {
        +hello(String name): String
    }

上述类图描述了HelloController类中的hello方法,该方法接收一个名为name的参数,并返回一个字符串。

甘特图

下面是HelloController类中的hello方法的甘特图:

gantt
    dateFormat  YYYY-MM-DD
    title  HelloController.hello 方法甘特图

    section HelloController.hello 方法
    方法实现                   :active, done, 2022-11-01, 2022-11-05
    参数处理                   :active, done, 2022-11-02, 2022-11-03
    URL 编码处理               :active, done, 2022-11-03, 2022-11-04
    结果返回                   :active, done, 2022-11-04, 2022-11-05

上述甘特图描述了HelloController类中hello方法的执行过程,包括参数处理、URL编码处理和结果返回。

结论

本文介绍了Spring Boot中入参中文被转换成URL编码的问题,并提供了禁用URL编码的解决方案。通过修改Spring Boot的配置文件,我们可以禁用URL编码,以保留中文字符的原始形式。但需要注意的是,在禁用