如何摆脱警告:PWC4011:无法将请求字符编码设置为 UTF-8

Posted

技术标签:

【中文标题】如何摆脱警告:PWC4011:无法将请求字符编码设置为 UTF-8【英文标题】:How to get rid of WARNING: PWC4011: Unable to set request character encoding to UTF-8 【发布时间】:2011-11-30 09:42:56 【问题描述】:

这是在 GlassFish 3.1 上,在 Mojarra 上使用 PrimeFaces 并用 MyFaces CODI 加盐。几乎每个请求都会出现以下消息:

警告:PWC4011:无法从上下文 /com.myapp_war_0.1 将请求字符编码设置为 UTF-8,因为已读取请求参数,或已调用 ServletRequest.getReader()

自从我开始这个项目以来就发生了这种情况——到目前为止我一直忽略它,但现在我意识到我在浪费大量时间阅读它。我发现了一个有趣但不完整的解决方法here,但我不明白。

有人可以建议如何在不抑制其他可能警告消息的情况下删除此消息吗?

【问题讨论】:

根据我的经验,这条著名的消息在升级 mojarra 版本后会丢失。你用的是哪一个? @Osw:在最早的 Mojarra 2.0.x 版本之一中确实存在一个相关的错误,但这是由稍微不同的问题引起的,并且仅影响 Ajax 请求。然而,OP 正在使用捆绑 JSF 2.1 的 GF 3.1。 @osw:具体来说,我正在使用 GF 3.1.1 Build 12。我可能不应该,但我让 Netbeans 和 GF 在所有更新可用时立即下载它们。然而,我几乎在每个版本级别都记得这个问题。它刚刚到了我测试很多页面的地步,在这个过程中产生了足够多的错误消息,我被激励采取行动。顺便说一句,这个包中的 Mojarra 版本是 2.1.3 (FCS b02)。 【参考方案1】:

JSF/Facelets 默认使用 UTF-8 解码 HTTP 请求参数。 GlassFish 本身默认使用 ISO-8859-1 解码 HTTP 请求参数。 HTTP 请求参数只能解析和解码一次,每当代码第一次请求请求参数时就会发生这种情况,例如request.getParameter("name")。因此,如果在 JSF 将请求参数编码设置为 UTF-8 之前第一次请求请求参数,那么它将(错误地)使用 ISO-8859-1 进行解析。

当JSF在restore view阶段需要如下设置请求参数编码时,

request.setCharacterEncoding("UTF-8");

当请求参数已经被解析时,GlassFish 将准确地显示这个警告。

不想要的结果是,所有这些 HTTP 请求参数都可能以Mojibake 结尾。表单数据最初是使用 UTF-8 提交和编码的。如果您使用不同的字符集(如 ISO-8859-1)解码 UTF-8 数据,则 8 位范围内及以上的字符(通常是那些“特殊字符”,如 éàö等将被破坏并最终出现在éàö等中。

从技术上讲,正确的解决方案是在 JSF 设置正确的编码之前请求 HTTP 请求参数。您基本上需要检查在 JSF 的恢复视图阶段之前运行的所有代码,例如 servlet 过滤器、阶段侦听器等,如果它们没有这样做的话。

如果您似乎找不到它,或者代码超出您的控制范围,那么您可以告诉 GlassFish 使用 UTF-8 来解码 HTTP 请求参数,这样在 JSF 时就不需要更改它想得到他们。您可以通过将以下条目添加到您的 /WEB-INF/glassfish-web.xml 文件的 <glassfish-web-app> 来做到这一点:

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

(注意:文件和根条目之前分别称为sun-web.xml&lt;sun-web-app&gt;

请注意,这是 GlassFish 特有的,当您将 web 应用程序部署到不同的服务器时,这一切都不起作用。规范的独立于服务器的方法是创建一个servlet filter,它在doFilter() 方法中基本上完成以下工作:

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

并确保它在任何其他需要收集任何 HTTP 请求参数的过滤器之前被映射。


更新:GlassFish为什么会提前设置,可能是PrimeFaces造成的。另请参阅此相关问题:Unicode input retrieved via PrimeFaces input components become corrupted。

【讨论】:

那行得通。再次感谢。我想知道为什么这种信息这么难找?如果没有这个网络服务,我会比我更绝望地落后于计划! 不客气。它在Glassfish wiki 和我的Unicode blog 中提到。 +1,说到 Java EE,你真是个天才。希望我能拥有你的大脑 :-) 我将征服互联网 :-) 我试过用 GlassFish v3.1.2 和 JSF 1.2.15 做这个,但没有运气:-( @BalusC 当我在localhost:4848 访问 Glassfish 管理服务器页面时收到此警告。我想你提到的文件是 "C:\glassfish3\glassfish\lib\install\applications__admingui\WEB-INF\sun-web.xml" ?如果是这样,则该文件已将参数编码标记设置为 UTF-8。任何其他想法如何摆脱这个警告? (我使用的是全新安装的 Glassfish)。

以上是关于如何摆脱警告:PWC4011:无法将请求字符编码设置为 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱增量注释处理请求的警告?

如何摆脱 GCC 中“从字符串常量到‘char*’的不推荐转换”警告?

警告:根:某些字符无法解码,并被替换为替换字符。带有请求和 Beastuifulsoup

“警告无法确定响应正文的内容长度”是啥意思。意思是我如何摆脱它?

警告为错误 - 如何摆脱这些

如何摆脱烦人的 Horizo​​ntalContentAlignment 绑定警告?