SpringMVC - 设置UTF-8编码
参考
-
sxhjhf - springMVC @response 中文乱码解决
修改Response的编码, 这是基于xml
配置文件的方法. -
spring-mvc-utf-8-encoding
这是基于xml
配置的, 关于输入的编码的问题.
全局修改输出为UTF-8编码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!-- utf-8编码 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
</beans>
- annotation方法
由方法1, 我们可以看到一个起关键作用的类org.springframework.http.converter.StringHttpMessageConverter
. 打开源码可以发现:
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
// 省略 ....
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
private final List<Charset> availableCharsets;
private boolean writeAcceptCharset = true;
public StringHttpMessageConverter(Charset defaultCharset) {
super(defaultCharset, MediaType.TEXT_PLAIN, MediaType.ALL);
this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
}
// 省略 ....
}
可以看到, 默认编码已经被设定为了Charset.forName("ISO-8859-1")
. 所以我们需要想办法替换掉这个默认编码. 方法1是通过xml
加载了参数为UTF-8
的StringHttpMessageConverter
.
回到使用注解配置的Java代码中:
因为配置SpringMVC的类, 需要继承于WebMvcConfigurerAdapter
, 我们可以看看里面有没有相关方法可用.
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer{...}
// 所以继续看WebMvcConfigurer
public interface WebMvcConfigurer {
/**
* Configure the {@link HttpMessageConverter}s to use for reading or writing
* to the body of the request or response. If no converters are added, a
* default list of converters is registered.
* <p><strong>Note</strong> that adding converters to the list, turns off
* default converter registration. To simply add a converter without impacting
* default registration, consider using the method
* {@link #extendMessageConverters(java.util.List)} instead.
* @param converters initially an empty list of converters
*/
void configureMessageConverters(List<HttpMessageConverter<?>> converters);
/**
* A hook for extending or modifying the list of converters after it has been
* configured. This may be useful for example to allow default converters to
* be registered and then insert a custom converter through this method.
* @param converters the list of configured converters to extend.
* @since 4.1.3
*/
void extendMessageConverters(List<HttpMessageConverter<?>> converters);
}
可以看到configureMessageConverters
和extendMessageConverters
两个方法. 区别是前者会覆盖掉默认的Converter
, 而后者是扩展. 所以我们只需要在我们继承于WebMvcConfigurerAdapter
这个类的实现中覆盖掉configureMessageConverters
方法即可.
实现如下:
@Configuration
@EnableWebMvc
@ComponentScan("me.xiaofud.spring101.spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
stringHttpMessageConverter.setWriteAcceptCharset(false);
converters.add(stringHttpMessageConverter);
}
测试:
curl -I -X POST "http://localhost:8080/app/post/add"
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain;charset=UTF-8
Content-Length: 1338
Date: Sun, 12 Nov 2017 14:17:49 GMT
修改读取参数时候的编码
在web.xml
中:
添加一个filter, 注册org.springframework.web.filter.CharacterEncodingFilter
.
<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>