[英]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¶m3=val4">Menu Item 1</a>
我们需要在请求链接之前添加一些JavaScript验证,因此我将其更改为:
<a target="mainframe" href="javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=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¶m3=val4')"
它会像你期望的那样保持在%26
?
<a target="mainframe" href="javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=val4')">Menu Item 1</a>
Urgh。 您有一个嵌入在URL中的URL,所有这些都嵌入在另一个URL中! 对于人类的大脑来说,这是太多的逃避。这:
javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=val4')
本身就是一个URL。 虽然是javascript:
伪URL,但你永远不应该使用它。 它被解码为JavaScript命令:
validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2&s2p2=val3¶m3=val4')
此时你已经失去了%26。 现在,当您将其用作URL本身时,它将失败。
通过将脚本移动到JavaScript块(或外部脚本)而不是HTML属性来避免多重编码问题:
<a target="mainframe" class="validateme" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&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.