You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot MVC中DispatcherServlet响应字符编码配置问题咨询

解决Spring Boot MVC中特殊字符(如ü、ë、è)的编码问题

嘿,针对你遇到的Spring Boot MVC里POST表单特殊字符的编码问题,咱们一步步来搞定——不光要调整响应编码,得先确保请求编码也没问题,毕竟如果Controller拿到的参数本身就是乱码,响应再正确也白搭。

1. 统一配置Spring MVC的请求与响应编码

在Spring Boot里,最简单的方式是通过配置文件全局设置编码,覆盖请求和响应的默认编码:

方式一:application.properties配置

直接在application.properties里添加以下配置,强制所有请求和响应使用UTF-8:

# 全局编码设置,覆盖请求和响应
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

force=true会强制Spring对所有请求和响应应用UTF-8编码,不管客户端有没有指定。

方式二:自定义WebMvc配置类

如果需要更灵活的控制,可以写一个配置类,显式设置字符串消息转换器的编码:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import java.nio.charset.StandardCharsets;

@Configuration
public class WebMvcEncodingConfig implements WebMvcConfigurer {

    @Bean
    public StringHttpMessageConverter stringHttpMessageConverter() {
        // 构造UTF-8编码的字符串转换器
        return new StringHttpMessageConverter(StandardCharsets.UTF_8);
    }
}

这个配置会让Spring在处理字符串类型的请求参数和响应内容时,统一使用UTF-8编码。

2. Tomcat层面的编码优化

不管你用的是Spring Boot内嵌Tomcat,还是外部独立Tomcat,都需要针对性配置编码:

内嵌Tomcat(Spring Boot默认)

application.properties里添加Tomcat专属的编码配置:

server.tomcat.uri-encoding=UTF-8
# 让Tomcat用请求体的编码处理URI,避免特殊字符乱码
server.tomcat.use-body-encoding-for-uri=true

外部独立Tomcat

修改Tomcat安装目录下conf/server.xml里的Connector节点,添加编码相关属性:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true"/>

另外,建议在conf/web.xml里添加Spring的字符编码过滤器,确保请求体编码正确:

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. 确认JSP页面的编码设置

你已经设置了JSP的UTF-8,再检查一下JSP顶部的page指令是否正确:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

同时,HTML页面的meta标签也要跟上,确保浏览器解析页面时用UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

4. 兜底:显式指定Controller响应编码

如果前面的配置还没解决问题,可以在Controller方法里显式指定响应的媒体类型和编码:

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ClubController {

    @PostMapping(value = "/submit-club", produces = MediaType.TEXT_HTML_VALUE + ";charset=UTF-8")
    public String submitClub(@RequestParam("clubName") String clubName) {
        // 处理俱乐部名称逻辑
        return "Received club: " + clubName;
    }
}

一般来说,按上面的步骤配置后,POST表单里的特殊字符就能被正确接收和响应了。

内容的提问来源于stack exchange,提问作者rolandl

火山引擎 最新活动