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

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

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

自从我开始这个项目以来,这个事情已经发生了 – 到目前为止,我一直忽略它,但现在我意识到我浪费了大量的时间来阅读它。 我在这里发现了一个有趣但不完整的工作,但是我不明白。

有人可以build议如何夯实这个消息,而不是压制其他可能的警告信息?

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

当JSF需要在恢复查看阶段如下设置请求参数编码时,

 request.setCharacterEncoding("UTF-8"); 

而请求参数已经被parsing,那么GlassFish将显示这个警告。

不必要的后果是,所有这些HTTP请求参数都可能以Mojibake结束。 表单数据最初是使用UTF-8提交和编码的。 如果使用不同的ISO-8859-1字符集对UTF-8数据进行解码,那么8位及以上的字符(通常是“特殊字符”,如éàö等)将被破坏并最终在éÃö等。

从技术上讲,正确的解决scheme是 JSF设置正确的编码之前 要求HTTP请求参数。 您基本上需要检查在JSF的还原视图阶段之前运行的所有代码,如servlet筛选器,阶段侦听器等,如果他们不这样做的话。

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

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

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

值得注意的是,这是GlassFish特有的,当你将webapp部署到不同的服务器时,这一切都不起作用。 规范的独立于服务器的方法是创build一个servletfilter ,它基本上在doFilter()方法中doFilter()以下任务:

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

并确保它已被映射到需要收集任何HTTP请求参数的任何其他filter之前。


更新 :至于为什么GlassFish事先设置它,这可能是由PrimeFaces引起的。 另请参阅以下相关问题: 通过PrimeFacesinput组件检索的Unicodeinput已损坏 。

没有什么只为我工作:

  1. 玻璃鱼pipe理员

  2. configuration – >服务器configuration – >logging器设置 – >日志级别

  3. 添加logging器:

logging器名称 :org.apache.catalina.connector.Request

日志级别 :严重/closures

如果出现任何错误,严重会更好