这是在GlassFish 3.1上使用的,在Mojarra上使用PrimeFaces并与MyFaces CODI一起腌制。在几乎每个请求上,都会显示以下消息:
WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context /com.myapp_war_0.1, because request parameters have already been read, or ServletRequest.getReader() has already been called
自从我开始这个项目以来,这种情况就发生了-到目前为止,我一直没有理会它,但是现在我意识到我在浪费大量时间阅读它。我发现了一个有趣但不完整的解决方法here,但我不理解。
有人可以建议如何在不抑制其他可能的警告消息的情况下篡改此消息吗?
最佳答案
默认情况下,JSF / Facelets使用UTF-8解码HTTP请求参数。 GlassFish本身默认使用ISO-8859-1来解码HTTP请求参数。 HTTP请求参数只能被解析和解码一次,并且这种情况每次在代码第一次请求请求参数时都会发生,例如request.getParameter("name")
。因此,如果在JSF将请求参数编码设置为UTF-8之前第一次请求请求参数,则将使用ISO-8859-1(错误地)对其进行解析。
当JSF需要在还原 View 阶段按如下方式设置请求参数编码时,
request.setCharacterEncoding("UTF-8");
当请求参数已被解析时,GlassFish将准确显示此警告。
不想要的结果是,所有这些HTTP请求参数都可能以Mojibake结尾。表单数据最初是使用UTF-8提交和编码的。如果使用其他字符集(如ISO-8859-1)对UTF-8数据进行解码,则8位及更高范围内的字符(通常是
é
,à
,ö
等“特殊字符”将被破坏)并以é
,Ã
,ö
等结尾从技术上讲,正确的解决方案是在JSF设置正确的编码之前,而不是请求HTTP请求参数。基本上,您需要检查在JSF的还原 View 阶段之前运行的所有代码,例如servlet过滤器,阶段侦听器等(如果没有这样做的话)。
如果您似乎找不到它,或者代码超出了您的控制范围,则可以告诉GlassFish使用UTF-8来解码HTTP请求参数,这样,当JSF想要获取它时就不需要更改它。他们。您可以通过将以下条目添加到
<glassfish-web-app>
文件的/WEB-INF/glassfish-web.xml
中来做到这一点:<parameter-encoding default-charset="UTF-8"/>
(注意:文件和根条目以前分别称为
sun-web.xml
和<sun-web-app>
)请注意,这是特定于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。
关于jsf-2 - 如何摆脱警告:PWC4011:无法将请求字符编码设置为UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7643484/