2010-08-16 34 views
1

我正在使用.NET解碼我的URL參數,如this article中所述。 在某些情況下,我需要在Javascript中獲取URL參數。但問題是一些參數值以'='結尾。使用Javascript剝離Base64編碼的URL參數

例:的itemid = Jj1TI9KmB74 = &貓= 1個

JavaScript函數:

function getUrlVars() { 
var vars = [], hash; 
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); 

for (var i = 0; i < hashes.length; i++) { 
    hash = hashes[i].split('='); 
    vars.push(hash[0]); 
    vars[hash[0]] = hash[1]; 
} 

return vars;} 

我知道我的問題是在分割功能在for循環,但我不知道如何解決它。 我也使用jsuri爲此,但問題仍然存在。 我可以在Javascript中解決這個問題嗎?還是需要重新考慮我的加密方法?

回答

1

=未編碼的URI查詢無效。你應該逃避它。然而,對於完整性,如果你真的需要做到這一點,試試這個:

額外注:如果您使用URI編碼逃脫=,在服務器端(例如$ _GET),它會被自動解碼。然而,使用JavaScript和location,您必須先解碼(decodeURIComponent)才能使用它。

而不是做的:

hash = hashes[i].split('='); 

其中後續等號被拆過,這樣做,而不是(非貪婪匹配的第一個等於之前的密鑰名稱符號,該值的其餘部分):

match = hashes[i].match(/([^=]+?)=(.+)/); 
key = match[1]; 
value = match[2]; 
2

在URL中有未編碼的=無效。爲此,您必須在base64編碼數據上額外應用encodeURIComponent()

然後base64編碼是否仍然有意義,供您決定。

參考:RFC 3986: Reserved characters

0

我假設你無法控制生成= s的過程嗎?正如Pekka所說的那樣是錯誤的。

但是,您可以在第一個手動分隔字符串=,例如

var i = hashes[i].indexof('='); 
if (i > 0) 
{ 
    var key = hashes[i].substring(0,i); 
    vars.push(key); 
    if ((i+1) < hashes[i].length) 
    { 
     vars[key] = hashes[i].substring(i+1); 
    } 
} 
else 
{ 
    // No value 
    vars.push(hashes[i]); 
}