【问题标题】:How many times should a URL-as-a-value-in-a-querystring should be encoded?URL-as-a-value-in-a-querystring 应该编码多少次?
【发布时间】:2011-10-16 09:05:42
【问题描述】:

我真的很困惑当 URL 设置为查询字符串中的值时,我应该编码多少次,因为我们知道浏览器有自己的编码过程。这是场景:

  • 我想重定向到另一个我想传递上一个 URL 的位置: 注:当前网址为http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE

方法A(没有encodeURIComponent()):

window.location = 'CostEstimateApproval.aspx?CEMID=40' + 
        '&ToStatus=1CE'+
        '&PrevURL=' + window.location;

我在地址栏中得到了这个

http://localhost:8081/CostMonitoring/CostEstimateApproval.aspx?CEMID=40&ToStatus=1CE&PrevURL=http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE

没有encodeURIComponent(),一切正常,接收页面中Request.Querystring("PrevURL")的值为

http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE 

这是正确的。

方法 B(使用encodeURIComponent()):

window.location = 'CostEstimateApproval.aspx?CEMID=40' + 
        '&ToStatus=1CE'+
        '&PrevURL=' + encodeURIComponent(window.location);

通过这种方法,我在地址栏中得到了这个:

http://localhost:8081/CostMonitoring/CostEstimateApproval.aspx?CEMID=40&ToStatus=1CE&PrevURL=http%3A%2F%2Flocalhost%3A8081%2FCostMonitoring%2FMainMenu.aspx%3FOption%3DAllCE

接收页面中Request.Querystring("PrevURL")的值为

http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE 

这也是正确解码的。

我的问题:

  1. 我应该将 URL 编码为值吗?如果我编码它然后浏览器再次编码它会是多余的吗?

  2. 还是应该让浏览器为我编码?如果我让浏览器,接收页面会不会从 URL-as-a-value 的值混淆到真正的 URL 值?请考虑这个例子:

    http://www.domain.com/newpage.aspx?SameName=DifferentValue&PrevURL=http://www.domain.com/oldpage.aspx?SameName=DifferentValue&PrevURL=http://www.domain.com/anypage.aspx

如您所见,两个 URL(真实 URL 和 URL-as-a-value)在未编码时具有相同的数据名称,即 SameName。接收方如何处理这个问题?还是 HTTP 服务器?

提前致谢!

【问题讨论】:

    标签: javascript urlencode httpserver


    【解决方案1】:

    你应该使用encodeURIComponent(一次),因为你正在编码一个url参数。

    正如您在问题末尾所指出的,如果您的网址包含&,则无法使用encodeURIComponent 对网址进行编码将会有问题。

    请注意,您的方法 A 仅起作用,因为您的示例 prevUrl 有点简单,例如它不包含第二个 url 参数。

    【讨论】:

    • 我认为你是对的,当我在地址栏中粘贴http://localhost:8081/CostMonitoring/Default.aspx?SameName=FromOrigURL&PrevURL=http://localhost:8081/CostMonitoring/Default.aspx?SameName=FromValueURL&PrevURL=http://localhost:8081/,并在接收页面打印SameNamePrevURL 的值时,它给了我FromOrigURL SameNamehttp://localhost:8081/CostMonitoring/Default.aspx?SameName=FromValueURL,http://localhost:8081/ 用于 PrevURL,考虑了两个 PrevURL
    猜你喜欢
    • 2022-12-27
    • 2022-10-25
    • 2022-12-02
    • 2022-11-20
    • 2022-12-02
    • 2022-12-02
    • 2022-12-02
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多