我的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 。
答案 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);
}