Servlet response.sendRedirect编码问题

时间:2012-11-08 13:34:33

标签: java jsp servlets utf-8 character-encoding

所以我以天真的方式使用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 个答案:

答案 0 :(得分:7)

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"已经是默认值,只是省略它。使用带contentType="text/html; charset=UTF-8"的JSP时,pageEncoding="UTF-8"也是默认值,只是省略它。你真正需要的只是<%@ page pageEncoding="UTF-8"%>。请注意,这与response.setCharacterEncoding("UTF-8")实际上有效,因此可以解释为什么它没有效果。 request.getCharacterEncoding()仅涉及POST请求正文,而不是GET请求URI,因此在GET请求的情况下它是无关紧要的。

答案 1 :(得分:0)

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

当我们使用response.sendRedirect()时:我们应该通过URLEncoder.encode()函数对URL进行编码然后才会编码..它将被正确编码..

再次感谢...