2013-02-22 44 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