如何摆脱警告: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已损坏 。
没有什么只为我工作:
-
玻璃鱼pipe理员
-
configuration – >服务器configuration – >logging器设置 – >日志级别
-
添加logging器:
logging器名称 :org.apache.catalina.connector.Request
日志级别 :严重/closures
如果出现任何错误,严重会更好