2015-01-15 232 views
3

我開發與JBoss EAP 6.3,它使用RestEasy的休息框架的Web應用程序,我有與作爲FormParam在POST資源通過特殊字符的壞編碼的問題,例如:壞特殊字符編碼與的RESTEasy

@POST 
@Path("/post") 
public Response createTask(@FormParam("param") String param) { 
    LOGGER.info("HELLO POST XML. "+param); 

    return Response.ok(param).build(); 

} 

如果我通過一個像abcèèè這樣的東西,我會得到一個像「abcèÃÃÃ訨,與澤西休息框架這個問題不存在。

我該怎麼辦?

感謝

+0

尋找一種方式來控制字符編碼 - 我會改變你的要求的字符編碼開始像這樣http://stackoverflow.com/questions/708915/detecting-the-character-encoding-of-an-http-post-request – gknicker

+0

但這樣我需要強制客戶端(可以是任何類型的任何地方)來檢查它的請求,即使我使用Chrome Advanced Rest Client插件,我也有這個錯誤!因爲這似乎是一個RestEasy問題,我只能想到服務器端解決方案 –

回答

4

的RESTEasy解決方案

由於的RESTEasy解釋使用servlet爲你的要求,你最好的選擇是使用Servlet過濾器來設置請求字符編碼:

public class CharacterEncodingFilter implements javax.servlet.Filter { 

    // ... 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain filterChain) throws IOException, ServletException { 
    request.setCharacterEncoding("UTF-8"); 
    filterChain.doFilter(request, response); 
    } 
} 

參考How to set charset for my web application?

JBoss解決方案

要確保應用程序服務器從客戶端請求以正確的編碼接收請求參數,您必須配置連接器。對於JBoss AS(第7版前)的變化:

<jboss_install>/server/deploy/jbossweb.sar/server.xml 

或在其它的JBoss AS版本:

<jboss_install>/server/(default)/deploy/jboss-web.deployer/server.xml 

設置連接器的URIEncoding:

<Connector port="8080" URIEncoding="UTF-8" /> 

參考JBoss Seam documentation: 16.1 Internationalizing your app

通過在JBoss AS 7及更高版本中更改standalone.xml來完成此配置,如this answer(也在JBossDeveloper forum中回答)。

服務器獨立的解決方案

因爲上面是一個JBoss依賴解,我的回答不會沒有提供獨立於服務器的解決方案是完整的。

最基本的是使用上下文參數指示應用程序中所有表單的字符編碼選項。設置上下文參數在WEB-INF/web.xml文件中完成。

<context-param> 
    <param-name>PARAMETER_ENCODING</param-name> 
    <param-value>UTF-8</param-value> 
</context-param> 

然後,您的應用程序可以讀取上下文參數,並可以在讀取任何請求參數之前設置請求字符編碼。您可以在任何一個Java Servlet或者在JSP語法請求編碼:

<% 
    String paramEncoding = application.getInitParameter("PARAMETER_ENCODING"); 
    request.setCharacterEncoding(paramEncoding); 
    String name = request.getParameter("NAME"); 
%> 

參考Character Conversions from Browser to Database

數據庫參與

您可能還需要設置你的數據庫的字符編碼,否則可能會丟失信息,在這個圖中:

Database configured for ASCII

參考Character Conversions from Browser to Database

附加信息中的Character encoding JSP -displayed wrong in JSP but not in URL和爲Tomcat在HttpServletRequest - setCharacterEncoding seems to do nothing

您也可以set the default encoding for the JVM

在RESTEasy 2.3.7版中修復了一個名爲「Text responses should default to charset UTF-8」的bug。

+0

JBoss配置隻影響URI參數 - 在URI中傳遞的參數,如''/ something?foo = bar''',但不是URL編碼參數傳遞給請求的正文(FormParams)。 – lefloh

+2

謝謝,我解析器只是添加一個設置爲utf-8的過濾器,如上所示的字符編碼 –

+0

很高興聽到這對你有用。請接受我的回答,如下所示:http://meta.stackexchange.com/a/5235/236612 – gknicker

1

我只是在我的項目的jboss-web.xml中的默認編碼申報,這解決了這個問題

<jboss-web> 
    <default-encoding>UTF-8</default-encoding> 
</jboss-web>