为什么我的Servlet不会响应UTF-8中的JSON请求?

时间:2010-09-17 16:56:34

标签: java json servlets encoding http-headers

我的Servlet不会使用UTF-8进行JSON响应。

MyServlet.java

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {

    PrintWriter writer = res.getWriter();

    res.setCharacterEncoding("UTF-8");
    res.setContentType("application/json; charset=UTF-8");

    writer.print(getSomeJson());
  }
}

但是特殊字符没有出现,当我检查我在Firebug中找回的标题时,我看到Content-Type: application/json;charset=ISO-8859-1

我在我的Servlet目录中做了一个grep -ri iso .,并且什么都没有,所以我没有明确地将类型设置为ISO-8859-1。

我还应该指定我在Eclipse中的Tomcat 7上以J2EE目标作为开发环境运行它,使用Solaris 10以及他们称之为Web服务器环境的任何人(其他人管理它)作为生产环境,并且行为是一样的。

我也确认提交的请求是UTF-8,只有响应是ISO-8859-1。

更新

我修改了代码以反映我在设置字符编码之前调用PrintWriter。我从原来的例子中省略了这一点,现在我意识到这是我问题的根源。我在阅读HttpServletResponse.getWriter()之前阅读here您必须设置字符编码,否则getWriter会将其设置为ISO-8859-1。

这是我的问题。所以上面的例子应该调整为

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {

    res.setCharacterEncoding("UTF-8");
    res.setContentType("application/json");

    PrintWriter writer = res.getWriter();
    writer.print(getSomeJson());
  }
}

3 个答案:

答案 0 :(得分:4)

为响应设置编码后,无法更改。

强制使用UTF-8的最简单方法是创建自己的过滤器,这是第一个查看响应并设置编码的过滤器。

看看how Spring 3.0 does this。即使您不能在项目中使用Spring,也许您可​​以获得一些灵感(确保您的公司政策允许您从开源许可证中获取灵感)。

答案 1 :(得分:1)

代码看起来很好。要么你没有运行你认为正在运行的代码,要么在请求 - 响应链中的某个地方有一些Filter或代理,它会像这样修改内容类型。

答案 2 :(得分:0)

除了特定的问题,你真的应该考虑获取输出流,使用JSON库直接以UTF-8编码的JSON编写内容;使用作家没有任何好处。 一些JSON包只能使用字符串,这是不幸的,但大多数允许使用更高效的流(更安全,更高效,因为解析器/生成器可以一起处理转义和编码方面)。