遇到403 Forbidden ,伺服器端查詢後結果是http get查詢字串中包含非法字元

yinghualeihenmei發表於2024-08-19

原文連結:https://blog.csdn.net/mm_hello11/article/details/84261672

https://blog.csdn.net/mm_hello11/article/details/84261672

報錯解釋:

HTTP GET請求透過查詢字串(即URL中"?"後面的部分)傳遞引數。如果查詢字串包含非法字元,伺服器可能會拒絕請求並返回錯誤,因為這些非法字元可能會破壞URL的格式或者伺服器的安全性。

非法字元通常指的是除字母、數字和某些預定義的字元(如-._~!$&'()*+,;=)以外的所有字元。

HTTP標準的兩種請求方式:Post和Get,關於這兩種請求方式的區別相關資料雲集,這裡不做闡述。然而,你是否注意到:
我們透過get方式從瀏覽器的位址列傳遞資料給伺服器,當引數的值中含有某些特殊跳脫字元的時候,沒經過些許處理將得不到預期的結果。

例如:
當我們的請求的url為:
http: // localhost:8080/index.jsp?parameter=kalman03#kalman#1
或許你預期在伺服器端獲得的parameter的結果為kalman03#kalman#1,錯!!!實際上得到parameter的值為kalman03。
這究竟是為什麼呢?
原因:
parameter的值含有特殊字元#,瀏覽器自動截斷#字元和其後面的值,這樣得到的值就為kalman03。
推廣:
當引數值中含有特殊字元 ?!=()#%& 的時候,獲得的值同樣也會出現與預期結果不一致的情況。
解決方案:
方法1:透過post方式傳遞資料;
方法2:對引數進行一次編碼parameter=escape(parameter);

第一種解決方案不解釋也能明白,現在解釋下第二種方法的處理:
JavaScript escape() 函式的功能是把其中某些字元替換成了十六進位制的轉義序列。該方法不會對ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他所有的字元都會被轉義序列替換

在get請求引數中如果包含&符號,在傳送請求時就會被當作引數的分割符處理
比如請求引數:
var url= "xxxx?name=" + "aaa&bbb"
期望的請求引數應該是name = aaa&bbb
實際的請求引數會變成 name = aaa 和 bbb=

處理方法

在拼接引數的時候,使用 encodeURIComponent() 進行手動轉義。
var url= "xxxx?name=" + encodeURIComponent("aaa&bbb")

特殊特殊字元的含義

字元 特殊字元的含義 URL編碼
+ URL 中+號表示空格 %2B
空格 URL中的空格可以用+號或者編碼 %20
/ 分隔目錄和子目錄 %2F
? 分隔實際的 URL 和引數 %3F
% 指定特殊字元 %25
# 表示書籤 %23
& URL 中指定的引數間的分隔符 %26
= URL 中指定引數的值 %3D
示例程式碼:

    //處理特殊字元get請求識別錯誤的情況
    //filename為帶有特殊字元的url字串
    var curFilename = null;
    //含有特殊字元的話,處理完再賦值(沒有處理空字串)
    if(filename.indexOf('#') != -1 || filename.indexOf('+') != -1 || filename.indexOf('/') != -1 || filename.indexOf('?') != -1 || filename.indexOf('%') != -1 || filename.indexOf('&') != -1 || filename.indexOf('=') != -1){
        curFilename = filename.replace(/([\#|\+|\/|\?|\%|\#|\&|\=])/g, function ($1) {
            return encodeURIComponent($1)
        })
    }else{
        //如果不含有特殊字元直接賦值
        curFilename = filename;
    }
    //傳送請求(我這裡是我專案中封裝的,大家正常傳送請求就可以)
    Cm.get(Cm.webroot + curFilename, function (msg) {
 
    },function (msg) {
 
    })

相關文章