使用Javascript剥离Base64编码的URL参数

时间:2010-08-16 09:29:11

标签: javascript asp.net

我在.NET中解码我的URL参数,如this article中所述。 在某些情况下,我需要在Javascript中获取URL参数。但问题是某些参数值以'='结束。

示例:?itemID = Jj1TI9KmB74 =& cat = 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-loop中的split-function但我不知道如何解决它。 我也使用了jsuri,但问题仍然存在。 我可以在Javascript中解决这个问题,还是需要重新考虑我的加密方法?

3 个答案:

答案 0 :(得分:2)

网址中未加密码的=无效。要做到这一点,您必须在base64编码数据上另外应用encodeURIComponent()

然后,base64编码是否仍然有意义,由你决定。

参考:RFC 3986: Reserved characters

答案 1 :(得分:1)

URI查询中未=未编码无效。你应该逃避它。但是,为了完整起见,如果您确实需要这样做,请尝试以下操作:

额外注意事项:如果您使用URI编码转义=,则在服务器端(例如$ _GET)将自动解码。但是,使用JavaScript和location,您必须先解码它(decodeURIComponent)才能使用它。

而不是:

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

其中后续的等号也被分开,而是这样做(在第一个等于键名的符号之前的非贪婪匹配,其余为值):

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

答案 2 :(得分:0)

我假设您无法控制生成= s的过程?正如佩卡说这是错误的。

但是你可以在第一个=,例如

手动打破字符串
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]);
}