1. 程式人生 > >URL請求後臺獲取不到特殊字元的引數

URL請求後臺獲取不到特殊字元的引數

URL特殊字元需轉義   
 
1、空格換成加號(+)   
2、正斜槓(/)分隔目錄和子目錄   
3、問號(?)分隔URL和查詢   
4、百分號(%)制定特殊字元   
5、#號指定書籤   
6、&號分隔引數

如果請求的URL中含有 %- _ . ! ~ * ' ( )等轉義字串,後臺轉義字元的原因:
如果你的表單使用get方法提交,並且提交的引數中有“&”等特殊符的話,如果不做處理,在service端就會將&後面的作為另外一個引數來看待。例如 
表單的action為list.jsf?act=Go&state=5 
則提交時通過request.getParameter可以分別取得act和state的值。 


如果你的本意是act='go&state=5'這個字串,那麼為了在服務端拿到act的準確值,你必須對&進行轉義

解決方法:

首先在前臺使用encodeURI() 、escape() 、encodeURIComponent() 函式可把字串作為 URI 進行編碼。

js對字元編碼有三種方法

  1.escape()   函式可對字串進行編碼,這樣就可以在所有的計算機上讀取該字串。

    說明: 該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他所有的字元都會被轉義序列替換。

 2.encodeURIComponent() 函式可把字串作為 URI 元件進行編碼。

    說明:該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他字元(比如 :;/?:@&=+$,# 這些用於分隔 URI 元件的標點符號),都是由一個或多個十六進位制的轉義序列替換的。

提示和註釋 
提示:請注意 encodeURIComponent() 函式 與 encodeURI() 函式的區別之處,前者假定它的引數是 URI 的一部分(比如協議、主機名、路徑或查詢字串)。因此 encodeURIComponent() 函式將轉義用於分隔 URI 各個部分的標點符號。 

3 .encodeURI() 函式可把字串作為 URI 進行編碼。

說明 
該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。

該方法的目的是對 URI 進行完整的編碼,因此對以下在 URI 中具有特殊含義的 ASCII 標點符號,encodeURI() 函式是不會進行轉義的:;/?:@&=+$,# 

總結:

通過對三個函式的分析,我們可以知道:escape()除了 ASCII 字母、數字和特定的符號外,對傳進來的字串全部進行轉義編碼,因此如果想對URL編碼,最好不要使用此方法。而encodeURI() 用於編碼整個URI,因為URI中的合法字元都不會被編碼轉換。encodeURIComponent方法在編碼單個URIComponent(指請求參 數)應當是最常用的,它可以講引數中的中文、特殊字元進行轉義,而不會影響整個URL。

其次需要在後臺進行替換處理:

	public static String replacer(String outBuffer) {

	      String data = outBuffer.toString();
	      try {
	         StringBuffer tempBuffer = new StringBuffer();
	         int incrementor = 0;
	         int dataLength = data.length();
	         while (incrementor < dataLength) {
	            char charecterAt = data.charAt(incrementor);
	            if (charecterAt == '%') {
	               tempBuffer.append("<percentage>");
	            } else if (charecterAt == '+') {
	               tempBuffer.append("<plus>");
	            } else {
	               tempBuffer.append(charecterAt);
	            }
	            incrementor++;
	         }
	         data = tempBuffer.toString();
	         data = URLDecoder.decode(data, "utf-8");
	         data = data.replaceAll("<percentage>", "%");
	         data = data.replaceAll("<plus>", "+");
	      } catch (Exception e) {
	         e.printStackTrace();
	      }
	      return data;
	   }

參考:http://blog.csdn.net/zljjava/article/details/38374455

參考:http://www.cnblogs.com/sunqiang/p/5893531.html

參考:http://stackoverflow.com/questions/11257509/urldecoder-illegal-hex-characters-in-escape-pattern-for-input-string-p