1. 程式人生 > >URL傳值帶加號“+”或者中文亂碼的解決方法

URL傳值帶加號“+”或者中文亂碼的解決方法

URL傳值帶加號“+”的問題的解決方法
今天在除錯客戶端向伺服器傳遞引數時,引數中的“+”全部變成了空格,原因是URL中預設的將“+”號轉義了。

解決方法如下:

方法一、修改客戶端,將客戶端帶“+”的引數中的“+”全部替換為‍“2B%”,這樣引數傳到伺服器端時就能得到“+”了。

方法二、修改伺服器端,將空格替換為“+”,這種方式只適用於引數中有‍“+”沒有空格的情況。

例子:

String a = reuqest.‍getParameter("clientStr")‍.replace(' ','+');

如果客戶端為clientStr=test+OK,那麼a的值為test+OK;

方法三、修改伺服器端,將獲取引數的方法由‍reuqest.‍getParameter改為‍r

equest.getQueryString().substring(0),然後對得到的字串進行解析。

‍‍String a =request.getQueryString().substring(0);客戶端為clientStr=test+OK,那麼a的值為‍clientStr=test+OK,需要再解析一下,

a=a.‍substring(10);得到a的值為‍test+OK。

附:一個JS,用來轉義URL中特殊字元的。

function URLencode(sStr) 
{
    return
escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F'); }

一、escape() 函式可對字串進行編碼,這樣就可以在所有的計算機上讀取該字串。
escape(string)
string 必需。要被轉義或編碼的字串。
返回值
已編碼的 string 的副本。其中某些字元被替換成了十六進位制的轉義序列。
說明
該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: * @ - _ + . / 。其他所有的字元都會被轉義序列替換。
二、定義和用法
encodeURI() 函式可把字串作為 URI 進行編碼。
encodeURI(URIstring)
URIstring 必需。一個字串,含有 URI 或其他要編碼的文字。
返回值
URIstring 的副本,其中的某些字元將被十六進位制的轉義序列進行替換。
說明
該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ’ ( ) 。
該方法的目的是對 URI 進行完整的編碼,因此對以下在 URI 中具有特殊含義的 ASCII 標點符號,encodeURI() 函式是不會進行轉義的:;/?:@&=+$,#
三、定義和用法
decodeURI() 函式可對 encodeURI() 函式編碼過的 URI 進行解碼。
decodeURI(URIstring)
URIstring 必需。一個字串,含有要解碼的 URI 或其他要解碼的文字。
返回值
URIstring 的副本,其中的十六進位制轉義序列將被它們表示的字元替換。

所以編碼對於+號是不起效果的的,但是中文亂碼可以採用編碼方法
中文亂碼的解決方法 ajax請求輸出資訊

if(isAjaxRequest(request) || request.getRequestURI().contains("scannerSubscribe") ){
                    String message = MessageFormat.format("您的賬號{0}在異地登入",chad.chen);
                    message =  URLEncoder.encode(message,StandardCharsets.UTF_8.name());
                    response.addHeader(AUTH_FAIL,message);//前端判斷
                    return;
                }

先編碼UTF-8編碼完成後在jsp解碼

success : function(data, status, xhr) {
                    if(xhr!=null && xhr.getResponseHeader("authFail")!=null){
                        alert(decodeURI(xhr.getResponseHeader("authFail")));
                        window.parent.location.href="<%=loginOutUrl%>";
                        return ;
                    }

亂碼問題就這樣解決了。