字符集过滤器在解析UTF-8字符时导致问题

vai*_*hav 4 java servlets spring-mvc utf-8 character-encoding

我正在使用Spring MVC的字符集过滤器.这是我用来从applet调用servlet的URL

http://192.168.0.67/MyServlet?p1 =団

如您所见,该参数具有unicode字符団.所以我用

URLEncoder.encode("?", "UTF-8"); 
Run Code Online (Sandbox Code Playgroud)

现在我的网址变成了

http://192.168.0.67/MyServlet?p1=%E5%9B%A3

但是,从servlet调用

request.getParameter("p1"); 
Run Code Online (Sandbox Code Playgroud)

已经返回一些无法解码的乱码URLDecoder.BTW,调用

URLDecoder.decode("%E5%9B%A3", "UTF-8"); 
Run Code Online (Sandbox Code Playgroud)

确实给了我原始的unicode角色.只是servlet在甚至可以解码之前使参数乱码.有谁知道为什么?request.getParameter()不使用UTF-8解码参数?

Bal*_*usC 6

Spring MVC的charset过滤器只会设置请求体编码,而不是请求URI编码.您需要在servletcontainer配置中为URI编码设置charset.许多servletcontainers默认使用ISO-8859-1来解码URI.目前还不清楚你正在使用什么servlet容器,所以这里只是Tomcat的一个例子:编辑要添加的<Connector>条目:/conf/server.xmlURIEncoding="UTF-8"

<Connector ... URIEncoding="UTF-8">
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因(例如第三方托管等)无法编辑服务器的配置,那么您应该考虑使用POST而不是GET:

String query = "p1=" + URLEncoder.encode("?", "UTF-8");
URLConnection connection = new URL(getCodeBase(), "MyServlet").openConnection();
connection.setDoOutput(true); // This sets request method to POST.
connection.getOutputStream().write(query.getBytes("UTF-8"));
// ...
Run Code Online (Sandbox Code Playgroud)

这样,您就可以doPost()使用ServletRequest#setCharacterEncoding()告诉Servlet API的使用什么字符集来解析请求主体(或仅仅依赖于Spring MVC的字符集过滤器从做这个工作):

request.setCharacterEncoding("UTF-8");
String p1 = request.getParameter("p1"); // You don't need to decode yourself!
// ...
Run Code Online (Sandbox Code Playgroud)

也可以看看: