2013-02-22 49 views
0

当我输入特殊字符(ö,ä,ñ,..)时,通过h:commandbutton发送的值有问题。当通过ajax请求(例如,对值进行更改侦听器或a4j:commandbutton)提交值时,所有工作都可以找到。但是,当通过h:commandbutton提交值时,收到的值会出现乱码。在JBoss 7上对JSF 2中的POST请求进行编码

我试过根据article written by BalusC来设置所有的东西。

我已经设置在JBoss的standalone.xml的URI enconding:

<property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/> 
<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/> 

添加了一个过滤器,设置请求的字符编码。然而,这不会改变任何东西,如果我读取参数映射(在设置编码之前或之后),那么参数就会混乱在那里。

还有什么我错过了吗?

我试过用JBoss 7.1.0和7.1.1和richfaces 4.1.0。

编辑:

即使的ExternalContext#getRequestCharacterEncoding()在豆类操作方法返回UTF-8(如要求在评论),它看起来像过滤器的问题。 当通过h:commandButton提交表单时,request.getCharacterEncoding()在我添加的UTF过滤器的doFilter()方法的开始处返回null。但request.parametersParsed已经如此。

当通过ajax request.getCharacterEncoding()提交的值已经是UTF-8。

因此,它看起来像编码设置不同,其他一些过滤器已经解析了参数。 request.context.filterConfigs中唯一的其他过滤器是org.jboss.weld.servlet.ConversationPropagationFilter。加上Picketlink可能已经在这个时候读取了参数。

编辑2: 在本thread in the PL forum讨论这似乎是在Picketlink的错误。还请检查相关的PL issue

+0

是的,我正在使用Facelets。 Chrome使用表单在页面的响应标题中显示“Content-Type:text/html; charset = UTF-8”。 – Markus 2013-02-22 19:15:05

+0

好的。该字符编码是否是链中第一个过滤器?如果某个其他过滤器调用了'getParameter()',那么设置它就太迟了。在调试的同时,当你在bean的action方法中打印时,ExternalContext#getRequestCharacterEncoding()会说什么? – BalusC 2013-02-22 19:21:35

+0

它是web.xml中的唯一过滤器,但我使用Picketlink进行身份验证。这可能会从请求中读取参数。但是,ExternalContext#getRequestCharacterEncoding()会返回utf-8,而不管过滤器是否处于活动状态。 – Markus 2013-02-22 23:26:27

回答

0

目前一切看起来都很好。

如果其他内容已经访问(因此隐式解析)请求主体之前您的字符编码过滤器已设置请求主体字符编码,则此构造将失败。现在为了解析请求主体而设置字符编码为时已晚。

根据评论,PicketLink似乎是这里的罪魁祸首。你需要告诉它使用UTF-8,或者如果这是不可能的,请在他们的开发团队中报告错误/问题报告。这至少不受JSF的控制,因此不是JSF相关的问题。

+0

是Picketlink在读取参数之前,我认为基本的问题是JBoss对默认编码进行了硬编码,并且过滤机制不适合设置编码。作为参考,我已经在[Picketlink论坛](https://community.jboss.org/thread/221662)中询问了这个问题。作为一种解决方法,可以实现与过滤器类似的阀门。感谢您的帮助。 – Markus 2013-02-23 17:23:54