我这样做:
<a href="http%3A%2F%2Flocalhost%3A8080%2Fnews.xhtml%3Fid%3D32%26lang%3Den" target="_blank" />
并在呈现时,链接指向:http://localhost:8080/news.xhtml?id=32&lang=en
我需要此链接指向已编码的网址,而不是解码的网址。
有谁知道怎么逃避它?
更新(根据评论):我需要它来实现在Facebook功能上分享这个。这样做的方法是调用以下链接:http://facebook.com/sharer.php?u=<encoded url to share>
答案 0 :(得分:5)
你为什么需要这个?然后,该链接将在技术上被打破。
无论如何,您基本上只需要用它们的URL编码表示%
替换百分比%25
(换句话说:只需将URL 编码两次)。
因此,您特定情况下的结果将是:
http%253A%252F%252Flocalhost%253A8080%252Fnews.xhtml%253Fid%253D32%2526lang%253Den
更新:正如您在JSF上下文中提到的那样,以下是您通常在JSF中创建链接的方式(因此默认情况下已经进行了URL编码):
<h:outputLink value="#{bean.url}" />
如果你想对它进行两次编码,你必须抓住JSTL的c:url
:
<c:url value="#{bean.url}" var="url" />
<h:outputLink value="#{url}" />
更新2 :根据评论,实际要求现在已经完全清楚了,那么正常的JSF方式就是这样(注意你不一定需要对它进行编码两次在这里!):
<h:outputLink value="http://facesbook.com/sharer.php">
<f:param name="u" value="#{bean.url}" />
</h:outputLink>
答案 1 :(得分:1)
我不确定你为什么这样做,但你实际上是双重逃避真正的网址:
var s0 = "http://localhost:8080/news.xhtml?id=32&lang=en";
var s1 = escape(s0);
var s2 = escape(s1);
var s3 = unescape(s2);
var s4 = unescape(s3);
// Assume function created for echo
echo("Original: " + s0);
echo("Escape1: " + s1);
echo("Escape2: " + s2);
echo("Unescape1: " + s3);
echo("Unescape2: " + s4);
这导致以下输出:
Original: http://localhost:8080/news.xhtml?id=32&lang=en
Escape1: http%3A//localhost%3A8080/news.xhtml%3Fid%3D32%26lang%3Den
Escape2: http%253A//localhost%253A8080/news.xhtml%253Fid%253D32%2526lang%253Den
Unescape1: http%3A//localhost%3A8080/news.xhtml%3Fid%3D32%26lang%3Den
Unescape2: http://localhost:8080/news.xhtml?id=32&lang=en
注意:通常您只想转义URL的各个参数,而不是整个URL本身。
答案 2 :(得分:0)
有许多资源可以为您执行此操作:
例如,HtmlEscape.net会将您的文字转义为http://localhost:8080/news.xhtml?id=32&lang=en。
这与浏览器所需要的一样多,这里有什么要求?
答案 3 :(得分:0)
我不清楚背景,但我想知道你是否故意编码整个网址?
我的理解是你只需要编码任何不符合URL标准的东西,比如空格,不指明目录的正斜杠等等。
但是假设您可能将URL作为get变量传递给您,也许,您可以使用类似javascript(或jquery)的内容来解码链接指向的位置而不会出现手动双重编码等问题。对于名为URL Encode的jquery来说,它是一个非常简单轻松的附加组件,它可以编码和解码。虽然源代码仍会反映编码,但链接(点击时或悬停时)都会反映未编码的URL