request.getQueryString()似乎需要一些编码
我有一些UTF-8的问题。 我的客户端(以GWT实现)向我的servlet发出一个请求,在URL中有一些参数,如下所示:
http://localhost:8080/servlet?param=value
当在servlet中检索URL时,我有一些UTF-8字符的问题。 我使用这个代码:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String reqUrl = request.getRequestURL().toString(); String queryString = request.getQueryString(); System.out.println("Request: "+reqUrl + "?" + queryString); ...
所以,如果我打电话给这个url:
http://localhost:8080/servlet?param=così
结果是这样的:
Request: http://localhost:8080/servlet?param=cos%C3%AC
我能做些什么来正确设置字符编码?
我之前遇到过这个问题。 不知道你正在使用什么Java servlet容器,但至less在Tomcat 5.x(不确定6.x左右)中, request.setCharacterEncoding()
方法对GET参数没有影响。 当你的servlet运行的时候,GET参数已经被Tomcat解码了,所以setCharacterEncoding
不会做任何事情。
两种方法来解决这个问题:
-
将连接器的URIEncoding设置更改为UTF-8。 请参阅http://tomcat.apache.org/tomcat-5.5-doc/config/http.html 。
-
正如BalusC所build议的那样,自己解码查询string,并手动将其parsing(而不是使用ServletRequest API)到自己的参数映射中。
希望这可以帮助!
从HttpServletRequest#getQueryString()javadoc :
返回 :包含查询string的string;如果URL不包含查询string,则返回 null。 该值不被容器解码。
注意最后的声明。 所以你需要使用java.net.URLDecoder 对自己进行URL解码 。
String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8");
但是,收集参数的正常方式是使用HttpServletRequest#getParameter() 。
String param = request.getParameter("param"); // così
如果你已经configuration它使用正确的编码,servlet容器已经为你进行了URL解码。 request.setCharacterEncoding()
只对请求主体(POST)有效,而不在请求URI(GET)上。 另请参阅幻影的答案。
它真的花了整整一天,但:
final String param = new String(request.getParameter("param").getBytes( "iso-8859-1"), "UTF-8");
另见这里 。 请注意, 如果服务器的解码字符集( URIEncoding
在tomcat中)是iso-8859-1
,那么这是有效的,否则这个字符集必须被传入。例如,如何从Tomcat 7的server.xml
获取URIEncoding
字符集看到我引用的答案
对于POST请求,我接下来解决了这个问题。
- 在server.xml中为连接器设置URIEncoding =“UTF-8”attr; (我使用Tomcat 8)
- 在参数检索前设置request.setCharacterEncoding(“UTF-8”)。
最后,我得到了正确的utf-8字符deliery:例如String name = request.getParameter(“name”);
名称包含正确的utf-8string。
http请求params编码有很多因素影响。 你可以参考这个问题的顺序指南。
1.检查你的表单的接受字符编码。
<form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8">
2.检查http服务器的默认字符编码值。 在apache http服务器的情况下,向httpd.conf文件添加"AddDefaultCharset UTF-8"
string。
3.如果您有后端服务器,请检查后端服务器的字符编码值。 在tomcat后端服务器的情况下,将“URIEncoding =”UTF-8“属性添加到您的连接器。例如,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
…
为http请求参数编码问题提供指导
pRes.setContentType("text/html; charset=UTF-8"); PrintWriter out = new PrintWriter(new (pRes.getOutputStream(), "UTF8"), true);
使用上面的代码,我得到了预期的结果:)