gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 04:49:39 25 4
gpt4 key购买 nike

我们在使用 <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 是不好的做法,但我们使用第三方库生成菜单,所以我无法更改这部分代码)

Servlet1 期望:
param1='val1'
param2='servlet2?s2p1=val2%26s2p2=val3'
param3='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 函数时,这通常不会发生,直到请求被转发到 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>

呃。你有一个 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 block (或外部脚本)而不是 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 以停止它。

关于javascript - 为什么 %26 在作为参数从链接传递给 JavaScript 函数时被解码为 &?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com