2013-03-19 105 views
6

我有UTF-8中的所有内容。这包括内容类型,数据库,文件,Java,一切(除非我错过了一些东西)。JBoss AS 7.1 - 请求参数编码

我遵循很多stackoverflow的答案,JIRA,博客等,但它仍然失败。

本身的问题如下:

当我提交,让我们假设,到http://localhost:8080/app/searh?text=café,调试,我request.getParameter("text")永远是错的,像caférequest.getCharachterEncoding()给我null(?)。

望着请求头,我得到这个:

GET http://localhost:8080/app/search?text=caf%C3%A9 HTTP/1.1 
Host: localhost:8080 
Proxy-Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17 
Referer: http://localhost:8080/app/search?text=n%C3%A3o 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: UTF-8,*;q=0.5 
Cookie: JSESSIONID=OMMITED 

和响应头:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Pragma: No-cache 
Cache-Control: no-cache 
Expires: Wed, 31 Dec 1969 21:00:00 BRT 
Content-Type: text/html;charset=UTF-8 
Transfer-Encoding: chunked 
Content-Encoding: gzip 
Vary: Accept-Encoding 
Date: Tue, 19 Mar 2013 14:06:24 GMT 
Proxy-Connection: keep-alive 
Connection: keep-alive 

这一切UTF-8。我只是不明白。

我试图通过-Dfile.encoding=UTF-8 -Dfile.io.encoding=UTF-8 -DjavaEncoding=UTF-8在我standalone.confJAVA_OPTS变量,试图把

<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"/> 

在我standalone.xml。这不能解决问题。

我能做些什么来解决这个问题?

在此先感谢。

顺便说一句:是JBoss AS 7.1.1。

回答

3

我遇到了同样的问题,但在Jboss 5.1中,我解决了它将URIEncoding属性添加到HTTP连接器(在jbossweb/server.xml中)并手动解码URL/GET参数。

但是在Jboss7中定义它的方式与以前的版本不同,但是使用google搜索了一下,我发现这个link:基本上你必须在standalone.xml或domain.xml文件中添加以下几行在</extensions>标签(它看起来像你已经完成了这一步;-):

<system-properties> 
     <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"/> 
</system-properties> 

而且你已经手动解码URI或参数与java.net.URIEncoder对象的帮助:

String param = URLDecoder.decode(request.getParameter("text"), "UTF-8"); 

BalusC有一个interesing post in his blog关于它。

最后,第二种解决方案,如果你想避免使用以前的选择:你有没有考虑过使用POST方法而不是GET方法?

我希望它有帮助。

+0

您好,感谢您的回答;我已经尝试的第一个解决方案没有奏效。在我的情况下使用POST将无济于事,因为是搜索,我希望用户可以复制该URL。我也尝试了你的第二个解决方案,并且错误依然存在。非常令人毛骨悚然......谢谢 – caarlos0 2013-03-19 16:51:07

+1

嗨Caarlos,我的心里回答,但我对你的问题有点好奇,现在我已经准备好了一个例子:我已经复制了你的问题,并且我终于完成了它的工作,并且该解决方案同时适用于Jboss 5.x和7.事实是,我提供的前两种解决方案实际上是一种解决方案,因此为了使其工作,您必须定义系统属性,而且您必须解码参数。我修改了答案。 – Toni 2013-03-19 20:58:31

+0

谢谢,我会考虑= D – caarlos0 2013-03-21 18:07:43

2

我解决了创建一个将请求和响应编码设置为UTF-8的过滤器的问题。

漂亮哈克,但工程。

+0

是的,我使用的JBoss EAP 6.1,并不得不使用'request.setCharacterEncoding(“ UTF-8“)'除了设置'catalina。*'属性外 – tbrugz 2015-06-10 15:43:18

1

我没有足够的知名度来为the answer by Toni S. Magraner添加评论,所以我会在这里写下。

request.getParameter(“text”)已经做了URL解码。调用URLDecoder.decode()再次将给予双重解码,这可能不会做你想做的。举个例子:

logger.error("p1:"+request.getParameter("p1")); 

http://localhost/test?p1=ku%2fki%44__%33X%C3%A9X 

打印调用它:

p1:ku/kiD__3XéX 
0

的standalone.xml或domain.xml中的配置不适合我的工作。

在jboss-as-7.1.1.Final刚加入这一行standalone.conf,该文件所居住的bin目录下:

JAVA_OPTS =“$ JAVA_OPTS -Dorg.apache.catalina.connector.URI_ENCODING = UTF-8"

来自:JBOSS 7 encoding not working as expected