避免URL编码

时间:2014-12-03 18:55:46

标签: struts2 urlencode

我的struts 2应用程序中存在与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

数字是单个变量,数据库将值返回为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

2 个答案:

答案 0 :(得分:4)

  

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

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

  

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

     

也就是说,你正在尝试解决问题X,并且你认为解决方案Y会起作用,但是当你遇到麻烦时,不要询问X,而是询问Y.

项目的规格中已经修复了一些错误,现在需要更多的错误才能解决第一个问题。

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

例如,如果要求具有可读网址(通常称为漂亮网址 RESTful网址),则可以使用{ {3}};假设你总是有三个数字,比如笛卡尔坐标;你可以这样做:

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

可通过网址调用:

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

,比原始网址更具可读性。但是有一些解决方案(不包括URL中的逗号)可以满足您的各种需求,这只是一个例子。

<强>旁注:

从您发布的网址(可能与您的真实用例完全无关),您似乎已将您的webapp挂载到根上下文,并且您是仅由变量组成的Action(没有操作名称) ;如果是这种情况,您可能需要Advanced Wildcard Mappings

language=english部分也可能完全伪造,但在远程情况下,您实际上是在自己处理语言,请注意to read this answer

答案 1 :(得分:0)

对于每个人来说这可能不是最好的方法,但我能够使用javascript来实现这一点。我彻底测试了这个功能,它目前正在服务于我的目的 我无法控制修改网址,因为它是第三方网址。

因此,当用户点击我网站上的超链接时,会调用一个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);
}