Spring @ResponseBody 返回乱码 的优雅解决办法

本文介绍了两种解决HTTP响应中文乱码的方法:一是通过配置StringHttpMessageConverter使用UTF-8编码;二是通过CharacterEncodingFilter强制设置请求编码为UTF-8。

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

返回的结果中,中文全部被问号(?)代替的解决办法:

*-servlet.xml的部分配置如下:

<bean id="utf8Charset" class="java.nio.charset.Charset"
		factory-method="forName">
		<constructor-arg value="UTF-8"/>
	</bean>

	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<constructor-arg ref="utf8Charset" />
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

思路非常简单:查看StringHttpMessageConverter可知其有两个构造函数,

public StringHttpMessageConverter() {
	this(DEFAULT_CHARSET);
}
public StringHttpMessageConverter(Charset defaultCharset) {
	super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
	this.defaultCharset = defaultCharset;
	this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
}
这里采用第二个构造函数向其中注入我们的utf8Charset


上面配置会覆盖 mvc:annotation-driven 默认配置的StringHttpMessageConverter,其余的MessageConverter应该不会受到影响。

具体文档描述如下:

Element : message-converters
Configures one or more HttpMessageConverter types to use for converting @RequestBody method parameters and 
 @ResponseBody method return values. Using this configuration element is optional. HttpMessageConverter 
 registrations provided here will take precedence over HttpMessageConverter types registered by default. Also see 
 the register-defaults attribute if you want to turn off default registrations entirely.

<mvc:annotation-driven>会默认配置一些HttpMessageConverter,Spring Reference描述如下:

HttpMessageConverter support for @RequestBody method parameters and @ResponseBody method return values from @RequestMapping or @ExceptionHandler methods.
This is the complete list of HttpMessageConverters set up by mvc:annotation-driven:
ByteArrayHttpMessageConverter converts byte arrays.
StringHttpMessageConverter converts strings.
ResourceHttpMessageConverter converts to/from org.springframework.core.io.Resource for all media types.
SourceHttpMessageConverter converts to/from a javax.xml.transform.Source.
FormHttpMessageConverter converts form data to/from a MultiValueMap<String, String>.
Jaxb2RootElementHttpMessageConverter converts Java objects to/from XML — added if JAXB2 is present on the classpath.
MappingJackson2HttpMessageConverter (or MappingJacksonHttpMessageConverter) converts to/from JSON — added if Jackson 2 (or Jackson) is present on the classpath.
AtomFeedHttpMessageConverter converts Atom feeds — added if Rome is present on the classpath.
RssChannelHttpMessageConverter converts RSS feeds — added if Rome is present on the classpath.

返回的结果中,中文全部是乱码(非问号)的解决办法:

在web.xml中加入以下Filter:

<filter>
		<filter-name>encodingFilter</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>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>



 
Spring中使用@ResponseBody注解返回结果时,可能会遇到中文乱码的问题。解决这个问题可以通过配置消息转换器来指定字符编码为UTF-8。 在代码中,可以添加如下配置来解决中文乱码问题: ```xml <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html; charset=UTF-8"/> <property name="defaultCharset" value="UTF-8"/> </bean> </mvc:message-converters> ``` 这段配置会将返回的字符串转换成UTF-8编码的字符。 另外,还可以在Spring配置文件中启用注解驱动的Spring MVC功能,这样也可以解决中文乱码的问题: ```xml <mvc:annotation-driven> <!-- 解决ResponseBody返回乱码 --> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html; charset=UTF-8"/> <property name="defaultCharset" value="UTF-8"/> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` 这样配置后,@ResponseBody注解返回的结果就不会出现中文乱码的问题了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法](https://download.csdn.net/download/weixin_38631225/12766950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [解决@ResponseBody注解返回中文乱码](https://blog.csdn.net/hh680821/article/details/104730498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值