【问题标题】:Why this Spring MVC controller returns corrupted UTF-8 String?为什么这个 Spring MVC 控制器返回损坏的 UTF-8 字符串?
【发布时间】:2014-10-06 03:51:40
【问题描述】:

我已经修改了很多地方以使我的 Spring MVC 可以使用 UTF-8,包括一个 char 过滤器、jsp 中的 contextType,以及修复 MySQL,所以我的项目可以完美地使用 UTF-8。

但是,这个新添加的功能并不正确

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST, produces = "text/plain;charset=UTF-8")
public @ResponseBody
String uploadFileHandler(
        @RequestParam("name") String name,
        @RequestParam("type") String type,
        @RequestParam("file") MultipartFile file//, HttpServletResponse response
        ) throws IOException {
//      response.setCharacterEncoding("UTF-8");
        if (file.isEmpty())
            return "Empty";

如你所见,我已经放了procudes和setCharacterEncoding。返回的字符串在 Ajax 中使用,我有

        var ajax = new XMLHttpRequest();
        ajax.overrideMimeType('text/xml;charset=UTF-8');

这里是jsp表单的开头

<form name = "myForm" method="POST" onsubmit="return validateForm()" enctype="multipart/form-data">

但我的网页仍然显示 ????。那么我还缺少什么?我没有 JQuery,所以希望没有使用它的解决方案,除非必须。

【问题讨论】:

  • return "Empty" 行看起来很有趣。你确定那些是ASCII字符吗?也许他们不是——也许是剪切和粘贴?
  • tomcat 还是 glassfish ?
  • @AlvinBunk Empty 是 UTF-8 而不是 ascii。看看这些字母。我​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

标签: java ajax spring-mvc utf-8


【解决方案1】:

发现这个链接是关于 ResponseBody 由于 Spring web “bug”而返回 UTF-8 字符串的问题

总结:

  1. 在 web.xml 中设置 org.springframework.web.filter.CharacterEncodingFilter 以强制执行 UTF-8
  2. 在 spring-servlet.xml 中设置 &lt;value&gt;text/plain;charset=UTF-8&lt;/value&gt;
  3. StringHttpMessageConverter 通过创建自己的类消除了问题

【讨论】:

    【解决方案2】:

    不确定你是如何配置你的 Maven 项目(如果你甚至在使用它的话)和 web.xml,但过去对以下问题的回答对我有帮助:

    【讨论】:

    • @Martin,我绝对没有放入maven,但做了web.xml。在我添加 maven 后,它仍然显示 ????。我会继续寻找。
    【解决方案3】:

    输入配置

    @Bean
    public org.springframework.web.filter.CharacterEncodingFilter characterEncodingFilter() {
        org.springframework.web.filter.CharacterEncodingFilter characterEncodingFilter = new org.springframework.web.filter.CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return characterEncodingFilter;
    }
    

    在控制器映射中 你可以添加

    produces = "text/plain;charset=UTF-8"

    但不是

    produces = "text/html;charset=UTF-8"

    例如:GetMapping ()强制ResponseBody输出编码为UTF-8

    @GetMapping(value = "/oith/getProcess", produces = "text/plain;charset=utf-8")
    public @ResponseBody
    ResponseEntity<String> getProcess(@RequestParam(value = "module") BigInteger moduleId) {
        return new ResponseEntity<>("any text...", HttpStatus.CREATED);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2014-01-23
      • 2021-08-14
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      相关资源
      最近更新 更多