Spring Tomcat Post Get 請求引數有中文時出現亂碼或+號變空格等關於編碼的問題

11個口袋發表於2017-09-22

  今天做Post,get請求的測試,出現瞭如題的錯誤,記錄一下,能力有限如有錯誤的請大家指正,謝謝!

系統環境:伺服器:Contos7,tomcat7,spring4.3.8,maven  IDE:intellijj idea 2017.1.2

客戶機:win7,android studio2.31

操作:客戶機在android裡面用HttpURLConection傳送請求,與編碼有關的東西測試如下:

在伺服器端的tomcat目錄下,conf下server.xml修改<Connector ... URIEncoding="UTF-8">這個引數是設定,

1、get請求時,所接收到的客戶機發過來的引數是什麼編碼格式。如果客戶機get時的引數有中文就是用,

URLEncode.encode("中文引數",“utf-8”),將引數轉成UTF-8格式的,然後伺服器Tomcat就要設定URIEncoding="UTF-8"這個引數。

這個是GET請求的,相對來說比較簡單。

2、Post請求時,有關引數與Get的設定是不一樣的注意了。

首先,如果客戶端Post中文引數時可以直接Post中文過去,可以不用轉編碼,但如果引數中有+號或&號,這兩個符號要用在你Post

引數到伺服器之前要把這兩個字元用下面的方法要替換

param=param.replace("+","%2B");
param=param.replace("&","%26");

這樣,要不然伺服器接到到這兩個字元會直接替換成空格。具體原因不知,找了很多地方沒解決,所以直接用replace來替換,特別注意一下。

我一直很奇怪不知是哪個地方設定的,可以直接Post中文過去而不用轉碼,因為系統會自動幫你轉碼。(一直沒找到在哪裡設定的,如果有大神知道,教下小弟)

post請求的返回值如果是中文的話,可以在web.xml裡配置一個過濾器,這樣可以定義返回值是你想要的編碼。

<filter>
<filter-name>charsetFilter</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>

客戶端接到到伺服器的返回資料,再UFT-8回來就是你要想要的結果了。

另外,如果你的返回值是實體類或者List,MAP等型別的話,要可以在 Spring裡新增一個轉換器,它會自動將這些型別,轉成Json字元。

轉換器:

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 配置Fastjson支援 -->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

我用的是阿里的Json工具,你也可以配成別的。

相關文章