【问题标题】:Spring MVC response encoding issueSpring MVC 响应编码问题
【发布时间】:2011-10-02 01:40:56
【问题描述】:

在过去的几个小时里,我阅读了很多关于这个主题的内容,但到目前为止没有任何效果。我正在尝试返回包含“奇怪”某些字符的响应。这是一个例子,很简单:

@ResponseBody
    @RequestMapping(value="test")
    public String test(){
        String test = "čćžđš";
        System.out.println(test);
        logger.info(test);
        return test;
    }

这是我的web.xml,因为我在 CharacterEncodingFilter 的帮助下找到了一些答案(但在我的情况下没有)。我使用 POST 方法是因为我读到这适用于 POST。

还发现了这个answer(相关)。也没有用。

当我调试它时,会出现正确的值,但是当我打印它时却没有,如下所示:

当我从 jmeter 测试时,响应似乎还可以,Content-Typetext/html;charset=UTF-8

这也是一个截图。 http://i56.tinypic.com/14lt653.jpg

我认为正确的方法是返回UTF-8,也许我错了。

【问题讨论】:

    标签: java servlets spring-mvc character-encoding


    【解决方案1】:

    而不是 @ResponseBody 使用 ResponseEntity。

    @RequestMapping(value="test")
    public ResponseEntity<String> test(){
        String test = "čćžđš";
        System.out.println(test);
        logger.info(test);
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.add("Content-Type", "application/json; charset=UTF-8");
        return ResponseEntity<String>(test,responseHeaders, HttpStatus.OK);
    }
    

    【讨论】:

      【解决方案2】:

      我的简单解决方案:

      @RequestMapping(value="test")
      public ModelAndView test(){
        String test = "čćžđš";
        ...
        ModelAndView mav = new ModelAndView("html_utf8");
        mav.addObject("responseBody", test);
      }
      

      和视图 html_utf8.jsp

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

      没有额外的类和配置。
      并且您还可以为其他内容类型创建另一个视图(例如 json_utf8)。

      【讨论】:

      • thansk 但我最后没有使用此服务来生成 html。我从 android 手机上使用它,将它作为纯文本发送 json 字符串
      【解决方案3】:

      几天后,我刚刚有了“谁是你爸爸的时刻”。它来自阅读 spring 3.0 参考,我没有其他尝试,所以为什么不阅读整个文档......以及@axtavt 答案的组合:

      Who sets response content-type in Spring MVC (@ResponseBody)

      改变原来的解决方案:

      public class EncodingPostProcessor implements BeanPostProcessor {
          public Object postProcessBeforeInitialization(Object bean, String name)
                  throws BeansException {
              if (bean instanceof AnnotationMethodHandlerAdapter) {
                  HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
                  for (HttpMessageConverter<?> conv: convs) {
                      if (conv instanceof StringHttpMessageConverter) {
                          ((StringHttpMessageConverter) conv).setSupportedMediaTypes(
                              Arrays.asList(new MediaType("text", "html", 
                                  Charset.forName("UTF-8"))));
                      }
                  }
              }
              return bean;
          }
      

      收件人:

      public class EncodingPostProcessor implements BeanPostProcessor {
          public Object postProcessBeforeInitialization(Object bean, String name)
                  throws BeansException {
              if (bean instanceof AnnotationMethodHandlerAdapter) {
                  HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
                  for (HttpMessageConverter<?> conv: convs) {
                      if (conv instanceof StringHttpMessageConverter) {
                          ((StringHttpMessageConverter) conv).setSupportedMediaTypes(
                              Arrays.asList(new MediaType("text", "plain", 
                                  Charset.forName("UTF-8"))));
                      }
                  }
              }
              return bean;
          }
      

      该死的春天!!!但我还是会继续使用它。

      【讨论】:

        【解决方案4】:

        我可以在实际交付的响应中看到两个问题。

        • 响应显然只是文本,但您的响应内容类型标头说它是 HTML。

        • 从响应的content-length来看,内容实际上并没有被编码为UTF-8。


        FWIW - CharacterEncodingFilter 无法解决您的问题,因为它处理的是请求的编码而不是响应。


        我认为问题在于您需要为响应正文配置消息转换器。但是,您的应用程序似乎已经在这方面有所作为,因为 StringHttpMessageConverter 的默认行为是使用“text/plain”作为其内容类型。

        【讨论】:

        • 谢谢,您的回答也让我思考并最终解决。
        猜你喜欢
        • 1970-01-01
        • 2019-03-31
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        相关资源
        最近更新 更多