Servlet响应.sendRedirect编码问题

3

我正在以一种朴素的方式使用GET方法重定向我的用户:

response.sendRedirect("/path/index.jsp?type="+ e.getType() 
   +"&message="+ e.getMessage());

直到我需要发送消息作为实际文本显示给用户时,这一切都很顺利。问题在于,如果消息中包含非ASCII字符,则会出现问题。我的.jsp文件采用UTF-8编码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

所以'message'中的所有非ASCII字符都会变成乱码。我不想将我的JVM默认编码设置为UTF-8,那么我该如何解决这个问题呢?我尝试使用

response.setCharacterEncoding("UTF-8");

在重定向之前,我尝试在Servlet中进行一些操作,但是它没有起作用。当我尝试执行以下操作时:
out.print(request.getCharacterEncoding());

在我的.jsp文件中,它打印出了“null”。
2个回答

9

sendRedirect() 方法不会为你编码查询字符串,你需要自己进行编码。

response.sendRedirect("/path/index.jsp?type=" + URLEncoder.encode(e.getType(), "UTF-8")
    + "&message=" + URLEncoder.encode(e.getMessage(), "UTF-8"));

你可能希望将样板代码重构为一个使用Map等实用方法。

请注意,我假设服务器也配置为使用UTF-8解码GET请求URI。您没有告诉我您正在使用哪个服务器,但例如Tomcat的情况下,只需将URIEncoding =“UTF-8”属性添加到<Context>元素中即可。

另请参阅:


与具体问题无关,language="java" 已经是默认值了,可以省略。使用 JSP 并且设置了 pageEncoding="UTF-8"contentType="text/html; charset=UTF-8" 也已经是默认值了,可以省略。你真正需要的是 <%@ page pageEncoding="UTF-8"%>。请注意,这实际上与 response.setCharacterEncoding("UTF-8") 的效果相同,这就解释了为什么它没有效果。request.getCharacterEncoding() 只涉及 POST 请求正文,不涉及 GET 请求 URI,因此在 GET 请求中无关紧要。

我在谷歌上搜索了如何在Weblogic上设置URI编码,但是我无法使其工作。你知道如何在Weblogic上设置它吗? - Hoffmann
weblogic.xml文件中完成。另见例如http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/weblogic_xml.html#1039258 - BalusC
好的,所以使用已弃用的URLEncoder.encode(String)解决了我的问题。我猜我也可以使用URLEncoder.encode(String, String)并获取JVM的字符集来解决它。这种方法有什么问题吗? - Hoffmann
您现在依赖于平台默认字符集,这很可能是ISO-8859-1。如果您只处理此字符集覆盖的字符,那么就不应该有问题。但是,如果您处理的字符不被此字符集覆盖(例如中文、希伯来语、梵文、西里尔文等),则仍将失败。UTF-8涵盖了人类所知道的任何字符,因此更好地为您的Web应用程序做好了全球扩张的准备。 - BalusC
哈哈,世界统治是每个Web应用程序的最终目标。感谢提供信息。 - Hoffmann

0

谢谢你... 当我使用 response.sendRedirect("/path/index.jsp?type=" + URLEncoder.encode(e.getType(), "UTF-8") 时,我的问题得到了解决...

当我们使用 response.sendRedirect() 时:我们应该通过 URLEncoder.encode() 函数对 URL 进行编码,这样才能正确地进行编码。

再次感谢...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接