2

使用 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。但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。

感谢您的回答

4

1 回答 1

1

您不会将 JSF 生成的 HTML 代码与您在浏览器的状态或地址栏中看到的任何内容混淆吗?当然,它已经在生成的 HTML 代码中完全进行了 URL 编码。我刚刚做了一个快速测试,根据浏览器中的查看源代码,它生成了(假设您没有更改 UTF-8 的 JSF2/Facelets 默认响应编码)以下 HTML:

<a href="index.jsf?test=%21+%C3%A5%C3%B6%C3%A4">Login page</a>

但实际上,index.jsf?test=%21+åöä当您悬停链接时,Chrome 和 Firefox 会显示在浏览器的状态栏中,单击链接时也会显示在地址栏中。这只是浏览器特定的功能,这是完全不同的事情。

我不确定你的具体问题是什么,因为你没有告诉任何关于它的事情,但是你提出问题的方式给我的印象是请求 URL 没有被有问题的 servletcontainer 正确地 URL 解码,因此你访问请求参数时收到mojibake 。

正如您现在可能已经猜到的,这必须在 servletcontainer 方面解决。还不清楚您使用的是哪一个,因此这里有一些 Tomcat 和 Glassfish 的示例:

  • 在 Tomcat 中,您需要将Tomcat 中元素的URIEncoding属性设置为.<Connector>server.xmlUTF-8

    <Connector ... URIEncoding="UTF-8">
    
  • 在 Glassfish 中,您需要<parameter-encoding>添加/WEB-INF/glassfish-web.xml

    <parameter-encoding default-charset="UTF-8" />
    

至于“解析”(实际上,“编码”是正确的术语)空格+,我不确定你为什么指出这一点,但这只是 URL 查询字符串中的空格应该如何编码。我认为您期望它是%20,但这只是 URL 的层次结构部分(查询字符串之前的部分,由 分隔?)中的空格应该如何编码。

于 2012-09-05T16:19:23.083 回答