【问题标题】:JSF2 h:outputLink won't encode properlyJSF2 h:outputLink 无法正确编码
【发布时间】:2012-08-30 09:30:40
【问题描述】:
使用 Mojarra 2.1.7
代码
<h:outputLink value="index.jsf">Login page
<f:param name="test" value="! åöä"></f:param>
</h:outputLink>
输出: index.jsf?test=%21+åöä
一些字符被转义,但其他字符没有。显然很难处理。
为什么会这样?有人知道管理这个问题的好方法吗?
http://docs.oracle.com/javase/6/docs/api/java/net/URLEncoder.html
似乎被使用了,因为它用 + 解析空间。
所有其他字符都是不安全的,首先转换为一个或
使用某种编码方案的更多字节。然后表示每个字节
由 3 个字符的字符串“%xy”,其中 xy 是两位十六进制
字节的表示。推荐使用的编码方案是
UTF-8。但是,出于兼容性原因,如果编码不是
指定,则使用平台的默认编码。
感谢回答
【问题讨论】:
标签:
jsf-2
character-encoding
url-encoding
mojarra
【解决方案1】:
您不会将 JSF 生成的 HTML 代码与您在浏览器的状态或地址栏中看到的任何内容混淆吗?当然,它已经在生成的 HTML 代码中完全进行了 URL 编码。我刚刚做了一个快速测试,根据 View Source 在浏览器中它生成了(假设您没有更改 UTF-8 的 JSF2/Facelets 默认响应编码)以下 HTML:
<a href="index.jsf?test=%21+%C3%A5%C3%B6%C3%A4">Login page</a>
但实际上,Chrome 和 Firefox 会在您悬停链接时在浏览器的状态栏中显示index.jsf?test=%21+åöä,当您单击链接时也会在地址栏中显示。那只是浏览器特有的功能,完全是另外一回事。
我不确定您的具体问题是什么,因为您没有说明任何问题,但是您提出问题的方式给我的印象是请求 URL 没有被相关 servletcontainer 正确地进行 URL 解码因此您在访问请求参数时收到了mojibake。
正如您现在可能已经猜到的,这必须在 servletcontainer 方面解决。还不清楚您使用的是哪一个,因此这里有一些 Tomcat 和 Glassfish 的示例:
-
在Tomcat中你需要将Tomcat的server.xml中<Connector>元素的URIEncoding属性设置为UTF-8。
<Connector ... URIEncoding="UTF-8">
-
在 Glassfish 中,您需要将 <parameter-encoding> 添加到 /WEB-INF/glassfish-web.xml:
<parameter-encoding default-charset="UTF-8" />
至于“解析”(实际上,“编码”是正确的术语)+ 的空格,我不确定您为什么指出这一点,但这只是 URL 查询字符串中的空格应该如何被编码。我认为您希望它是 %20,但这只是 URL 的分层部分(查询字符串之前的部分,由 ? 分隔)中的空格应该如何编码。