繁体   English   中英

为什么%26会被解码为&作为参数从链接传递给JavaScript函数?

[英]Why does %26 get decoded to & when passed as a parameter to a JavaScript function from a link?

我们在Web应用程序中有一个菜单,它使用<a>标签在主框架中加载页面。

菜单中的典型项目如下:

<a target="mainframe" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4">Menu Item 1</a>

我们需要在请求链接之前添加一些JavaScript验证,因此我将其更改为:

<a target="mainframe" href="javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4')">Menu Item 1</a>  

(我知道javascript:function链接中的javascript:function是不好的做法,但我们使用第三方库来生成菜单,所以我无法更改这部分代码)

Servlet1期望:
参数1 = 'VAL1'
参数2 = 'servlet2?s2p1 = VAL2%26s2p2 = VAL3'
参数3 = 'VAL4'

Servlet1然后转发到param2的值,因此Servlet2期望:
s2p1 = 'val2的'
S2P2 = 'VAL3'

但是当我在我的验证函数中发出alert来检查传入的内容时:

function validate(href) {
    alert(href);

    ...validation code...
}

它给予:
/ servlet1?param1 = val1&parma2 = servlet2?s2p1 = val2 **&** s2p2 = val3&param3 = val4(注意上面函数调用中的粗体& %26

%26传递给JS函数时, %26将被转换为& ,这通常不会发生,直到请求被转发到Servlet2 因为%26已经被更改为& s2p2请求参数被servlet1而不是servlet2

基本上我的问题是为什么%26只是通过将它作为参数从href属性传递给函数来转换为& ,如果你执行onClick="validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4')"
它会像你期望的那样保持在%26

<a target="mainframe" href="javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4')">Menu Item 1</a>

Urgh。 您有一个嵌入在URL中的URL,所有这些都嵌入在另一个URL中! 对于人类的大脑来说,这是太多的逃避。这:

javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4')

本身就是一个URL。 虽然是javascript:伪URL,但你永远不应该使用它。 它被解码为JavaScript命令:

validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2&s2p2=val3&param3=val4')

此时你已经失去了%26。 现在,当您将其用作URL本身时,它将失败。

通过将脚本移动到JavaScript块(或外部脚本)而不是HTML属性来避免多重编码问题:

<a target="mainframe" class="validateme" href="/servlet1?param1=val1&amp;parma2=servlet2?s2p1=val2%26s2p2=val3&amp;param3=val4">Menu Item 1</a>

(这里还要注意&符号的必要HTML转义。)然后从脚本执行:

// find 'validateme' links and add event handler
//
for (var i= document.links; i-->0;)
    if (document.links[i].className==='validateme')
        document.links[i].onclick= validate;

然后在您的验证函数中,如果一切正常并且您希望遵循链接,则返回true否则返回false以停止它。

不, %26被(正确地)解释为HTML文件首次读入浏览器时,而不是传递给JavaScript函数时。 如果你想要字符序列的字符“百分之二六”,那么你必须将其编码为%2526

javascript:协议仍被视为有效的URL,因此浏览器正在对其进行编码。 在Javascript中解码它很容易...

alert(decodeURIComponent(href));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM