【问题标题】:Servlet response.sendRedirect encoding problemsServlet response.sendRedirect 编码问题
【发布时间】:2012-10-28 16:52:53
【问题描述】:

所以我以一种天真的方式使用 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"%>

所以“消息”中的所有非 ASCII 字符都会出现乱码。我不想将我的 JVM 默认编码设置为 UTF-8,那么我该如何解决呢?我尝试使用

response.setCharacterEncoding("UTF-8");

在重定向之前在 Servlet 上,但它不起作用。当我尝试执行时:

out.print(request.getCharacterEncoding());

在我的 .jsp 文件中,它会打印“null”。

【问题讨论】:

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


    【解决方案1】:

    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" 属性添加到 &lt;Context&gt; 元素即可。

    另见:


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

    【讨论】:

    • 我用谷歌搜索了如何在 weblogic 上设置 URI 编码,但我无法让它工作。您是否知道如何在 weblogic 上设置它?
    • weblogic.xml 中进行操作。另见例如docs.oracle.com/cd/E13222_01/wls/docs81/webapp/…
    • 好的,所以使用已弃用的 URLEncoder.encode(String) 解决了我的问题。我想我可以使用 URLEncoder.encode(String, String) 并获取 JVM 的字符集也可以解决它。这种方法有问题吗?
    • 您现在依赖的平台默认字符集很可能是 ISO-8859-1。如果您通过此字符集专门处理 covered 的字符,那么应该没有问题。但是,如果您正在处理此字符集未涵盖的字符(例如中文、希伯来文、梵文、西里尔文等),那么它仍然会失败。 UTF-8 涵盖了人类所知道的任何字符,因此可以更好地让您的 web 应用程序为统治世界做好准备。
    • 哈哈,统治世界是每个 webapp 最终的结局。感谢您的信息。
    【解决方案2】:

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

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

    再次感谢...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2014-04-27
      • 2023-03-05
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      相关资源
      最近更新 更多