中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

tomcat GET請求傳參亂碼問題怎么解決

發布時間:2022-01-14 10:40:39 來源:億速云 閱讀:252 作者:iii 欄目:大數據

這篇“tomcat GET請求傳參亂碼問題怎么解決”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“tomcat GET請求傳參亂碼問題怎么解決”文章吧。

在Tomcat的通道(Connector)配置中,除了URIEncoding之外,還有一個影響編碼的參數useBodyEncodingForURI,關于這個參數,官方文檔說明如下:


This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This

setting is present for compatibility with Tomcat 4.1.x, where the encoding

specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.

Notes: 1) This setting is applied only to the query string of a request. Unlike URIEncoding it does not affect the path portion of a request URI. 2) If request character encoding is not known (is not provided by a browser and is not set bySetCharacterEncodingFilter or a similar filter using Request.setCharacterEncoding method), the default encoding is always "ISO-8859-1". The URIEncoding setting has no effect on this default.

其作用大致概括下就是,contentType中指定的編碼是否要替換URIEncoding已經設置的值。或者說將Body的編碼用于URI的參數解析,這個Body的編碼有兩方面的來源:

  • request.setCharacterEncoding()

  • request header中設置的contentType中包含的編碼

如果從上述兩個地方能夠獲取到charset信息,同時useBodyEncodingForURI參數也設置為true,此時GET請求的參數解析也使用同一個charset。

如果兩個地方都拿不到charset,那Body的編碼會使用默認值ISO-8859-1,這個一般都能注意到。但這個參數設置為true時,相當于有個隱含的條件,即GET請求的編碼也會使用默認編碼ISO-8859-1,而無論你之前的URIEncoding設置的是什么編碼。

那這種情況下,雖然URIEncoding設置的編碼可以正常處理中文,但再配置上了這個開并,卻并沒有按照其規定設置,就會導致亂碼再次產生。而Tomcat8默認已經將URIEncoding設置為UTF-8,如果配置中指定useBodyEncodingForURI這一項,亂碼就出現了。

這一配置,默認項為false,

/**
* URI encoding as body.
*/
protected boolean useBodyEncodingForURI = false;

使用這一配置是否生效的地方,在這里

// getCharacterEncoding() may have been overridden to search for
// hidden form field containing request encoding
String enc = getCharacterEncoding();

boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
if (enc != null) {
   parameters.setEncoding(enc);
   if (useBodyEncodingForURI) {
       parameters.setQueryStringEncoding(enc);
   }
} else {
   parameters.setEncoding
       (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
   if (useBodyEncodingForURI) { //這里的配置是比較容易忽略的地方
       parameters.setQueryStringEncoding
           (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING); }
}

再看對于enc變量的獲取

coyote包中的Request類:
 
/**
* Get the character encoding used for this request.
*/
public String getCharacterEncoding() {

   if (charEncoding != null) { //這里的值即是通過request.setCharacterEncoding設置的
       return charEncoding;
   }
   charEncoding = getCharsetFromContentType(getContentType());
   return charEncoding;
}

關于從ContentType中獲取charSet的代碼的代碼此處就不再羅列了。

簡要總結如下:

影響URI參數解析編碼(GET請求)的地方共有:
1. Connector 的URIEncoding 配置
2.  Connector的useBodyEncodingForURI 配置,此配置為true時則直接使用ContentType的charset或者request.setCharacterEncoding指定的encoding。
注意,request設置的會先被使用。
3. 特別注意,當設置useBodyEncodingForURI為true時,如果getCharacterEncoding為空,即request未設置編碼,并且ContentType也未配置charset,則queryString會被設置為ISO-8859-1

以上就是關于“tomcat GET請求傳參亂碼問題怎么解決”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣汉县| 凌源市| 山丹县| 磐安县| 松潘县| 陆河县| 许昌县| 新乡市| 峡江县| 仪征市| 曲麻莱县| 顺义区| 九寨沟县| 上思县| 凌源市| 榕江县| 迁西县| 治县。| 拉孜县| 苏州市| 华蓥市| 根河市| 沂水县| 子长县| 无极县| 瓦房店市| 庐江县| 太康县| 益阳市| 绵竹市| 神池县| 龙井市| 大姚县| 吴旗县| 万安县| 连城县| 浦江县| 南昌县| 柯坪县| 武胜县| 临城县|