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

Ala*_*ect 22 primefaces jsf-2 glassfish-3 mojarra

这是在GlassFish 3.1上,使用PrimeFaces而不是Mojarra,并使用MyFaces CODI进行腌制.几乎每个请求都会出现以下消息:

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

自从我开始这个项目以来,这已经发生了 - 到目前为止,我一直忽视它,但现在我已经意识到我浪费了很多时间阅读它.我在这里发现了一个有趣但不完整的工作,但我不明白.

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

Bal*_*usC 41

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

当JSF需要在恢复视图阶段设置请求参数编码时,如下所示,

request.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

虽然已经解析了请求参数,但GlassFish将准确显示此警告.

不必要的后果是,所有这些HTTP请求参数都可能最终出现在Mojibake中.表单数据最初使用UTF-8提交和编码.如果您在使用不同的字符集,如ISO-8859-1解码UTF-8的数据,然后在8位范围和超越(人物通常,它是那些"特殊字符"一样é,à,ö等将被破坏,并最终在é,à,ö,等.

从技术上讲,正确的解决方案是 JSF设置正确的编码之前要求HTTP请求参数.基本上,您需要检查所有这些,如果他们不这样做,JSF的恢复视图阶段之前运行,如Servlet过滤器,阶段监听器等代码.

如果您似乎无法找到它,或者代码无法控制,那么您可以告诉GlassFish使用UTF-8代替解码HTTP请求参数,以便在JSF想要获取时不需要更改它他们.您可以通过<glassfish-web-app>/WEB-INF/glassfish-web.xml文件中添加以下条目来实现:

<parameter-encoding default-charset="UTF-8"/>
Run Code Online (Sandbox Code Playgroud)

(注意:文件和根条目以前称为sun-web.xml<sun-web-app>分别)

需要注意的是,这是特定于GlassFish的,当您将Web应用程序部署到其他服务器时,这一切都不起作用.规范的服务器独立方法是创建一个servlet过滤器,它基本上完成了doFilter()方法中的以下工作:

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
Run Code Online (Sandbox Code Playgroud)

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


更新:至于为什么GlassFish预先设置它,它可能是由PrimeFaces引起的.另请参阅此相关问题:通过PrimeFaces输入组件检索的Unicode输入已损坏.

  • +1,在Java EE方面,你真的是一个天才.希望我能拥有你的大脑:-)我将征服互联网:-) (8认同)
  • @BalusC当我访问位于http:// localhost:4848的Glassfish管理服务器页面时,我收到此警告.我假设你提到的文件是"C:\ glassfish3\glassfish\lib\install\applications\__ admingui\WEB-INF\sun-web.xml"?如果是这样,则此文件已将参数编码标记设置为UTF-8.任何其他想法如何摆脱这种警告?(我正在使用Glassfish的干净安装). (3认同)