SpringMVC-設(shè)置UTF-8編碼

SpringMVC - 設(shè)置UTF-8編碼

參考

全局修改輸出為UTF-8編碼

  1. xml 方法
    sxhjhf - springMVC @response 中文亂碼解決
<?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>
  1. annotation方法
    由方法1, 我們可以看到一個(gè)起關(guān)鍵作用的類org.springframework.http.converter.StringHttpMessageConverter. 打開源碼可以發(fā)現(xiàn):
    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());
        }
        // 省略 ....
    }

可以看到, 默認(rèn)編碼已經(jīng)被設(shè)定為了Charset.forName("ISO-8859-1"). 所以我們需要想辦法替換掉這個(gè)默認(rèn)編碼. 方法1是通過xml加載了參數(shù)為UTF-8StringHttpMessageConverter.
回到使用注解配置的Java代碼中:
因?yàn)榕渲肧pringMVC的類, 需要繼承于WebMvcConfigurerAdapter, 我們可以看看里面有沒有相關(guān)方法可用.

public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer{...}
// 所以繼續(xù)看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);
}

可以看到configureMessageConvertersextendMessageConverters兩個(gè)方法. 區(qū)別是前者會覆蓋掉默認(rèn)的Converter, 而后者是擴(kuò)展. 所以我們只需要在我們繼承于WebMvcConfigurerAdapter這個(gè)類的實(shí)現(xiàn)中覆蓋掉configureMessageConverters方法即可.
實(shí)現(xiàn)如下:

@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

修改讀取參數(shù)時(shí)候的編碼

web.xml中:
添加一個(gè)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> 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容