【问题标题】:Avoid URL Encoding避免 URL 编码
【发布时间】:2014-12-03 18:55:46
【问题描述】:

我在我的 struts 2 应用程序中遇到了与 url 编码相关的问题。我做了一些研究,但找不到正确的方法。

我的应用程序动态准备 url 并通过查询数据库获取变量。我期望的有效 URL 是
http://www.test.com/language=english&numbers=X,Y,Z

但是,由于 URL 编码在 UI 上时,我得到的 URL 如下
http://www.test.com/language=english&numbers=X%2CY%2CZ

numbers 是单个变量,数据库返回 X,Y,Z 的值。

我正在准备jsp中的URL如下

<s:url id="testUrl" escapeAmp="false" value="http://www.test.com">
  <s:param name="language" value="%{'english'}" />
  <s:param name="numbers" value="%{Num}" />
</s:url>

我确实在 s:url 标记中尝试了 encode="false" 但无济于事。

testUrl 是下面的超链接

<a href="<s:property value="#testUrl" />" target="_blank">
  <s:property value="#Num" /> 
</a>

我了解逗号(,) 是保留字符,应该进行编码。但是,在我的 URL 中,我需要该逗号以便在单击时成功执行 URL。 我正在使用字符集 iso-8859-1

【问题讨论】:

  • 你想传递一个数字列表吗?
  • 那么你的网址应该看起来像这样 - `numbers=X&numbers=Y&numbers=Z。
  • 很遗憾,这是一个第三方 URL,需要 X、Y、Z 格式的数字列表。我设法在单击 URL 时对其进行解码。可能不是最好的方法,但目前它正在为我的目的服务。我会为此更新答案。

标签: struts2 urlencode


【解决方案1】:

我了解逗号(,) 是保留字符,应该进行编码。 但是,在我的网址中,我需要那个逗号

那你不...这是the XY problem完美示例:

XY 问题是询问您尝试的解决方案,而不是您的实际问题。

也就是说,您正在尝试解决问题 X,并且您认为解决方案 Y 会奏效,但是当您遇到麻烦时,您不会询问 X,而是询问 Y。

项目规范中已经修复了一些错误,现在它需要更多错误来解决第一个问题。

您不应在 URL 中使用未转义的逗号;向后遍历规范链,找到可以将它们分支到更新、更安全的方向的位置。

如果要求是,例如,具有可读的 URL(通常称为 Pretty URLsRESTful URLs),您可以使用 @ 987654322@;假设你总是有三个数字,比如笛卡尔坐标;你可以这样做:

<action name="/coordinates/{x}/{y}/{z}" class="foo.bar.CartesianAction">

可通过 URL 调用:

http://www.test.com/coordinates/1/2/3

,比您的原始 URL 更具可读性。但是对于您可能有的各种需求,都有解决方案(不涉及 URL 中的逗号),这只是一个示例。

旁注:

从您发布的 URL(可能与您的实际用例完全无关),您似乎已将 webapp 安装在根上下文中,并且您是一个仅由变量组成的操作(没有操作名称) ;如果是这种情况,您可能需要to read this answer

language=english 部分也可能完全是伪造的,但在远程情况下,您实际上是在自己处理语言,请注意 the framework would be happy to help you on that

【讨论】:

  • 非常感谢您的建议!我写的 URL 是第三方 URL,仅用于说明目的。该 URL 确实有一个映射到它的操作名称。为了进一步分析 - 我试图在任何 URL 中找到逗号的目的..
  • 很高兴有帮助。随时更新您的问题以获得更有针对性的答案,如果有帮助,请考虑投票
【解决方案2】:

这可能不是每个人的最佳方法,但我能够使用 javascript 使其工作。我彻底测试了该功能,它目前正在服务于我的目的。
我无法控制修改该 URL,因为它是第三方 URL。

因此,当用户单击我网站上的超链接时,会调用 java 脚本。 URL 被解码并在新窗口中打开。

<a href="#" onclick="decodeURL('<s:property value="#testUrl"/>')">
   <s:property value="#Num" /> 
</a>

Javascript

function decodeURL(url) {
var url_dec = decodeURIComponent(url);
window.open(url_dec);
}

【讨论】:

    猜你喜欢
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2014-03-31
    • 2010-10-22
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多