当前位置: 首页 > 知识库问答 >
问题:

Spring中的响应编码

左丘昊天
2023-03-14

我在超文本传输协议响应的字符编码方面遇到了问题。我阅读了许多技巧、教程等。,但我无法解决我的问题。我们使用带有Hibernate和ExtJS的Spring MVC作为视图技术。所有数据都以JSON的形式返回,使用控制器上的@响应体方法。示例方法:

@RequestMapping(method = RequestMethod.POST, value = "dispatcher")
@ResponseBody
public String dispatcherPost(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
    return process(req, resp, session);
}

有一种简单的调度机制来调度url命令(在这种情况下并不重要)。Process方法处理参数并返回JSON。例如,该JSON包含来自数据库(PostgreSQL 9.1.4)的数据。Postgres中的数据存储在UTF-8中,并且“正确可见”,例如在pgAdmin中。在eclipse中调试时,我们还可以看到有效的数据(来自数据库)。从博士后那里获取数据似乎一切正常。当我们想通过@ResponseBody注释方法返回它们时,问题就开始了。方法“process”返回具有utf-8字符的有效字符串(我可以在调试模式下看到),但在web浏览器(chrome、firefox)中有“?”而不是存储在数据库中的波兰语字符。查看firebug,我可以看到响应头部分有效:“内容类型:text/html;字符集=UTF-8’。我之所以说“部分”,是因为我在过程方法中有一行代码:

'resp.setContentType("Application/json; charset=UTF-8");'

<!-- Force Char Encoding -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

所以基本上问题在于从服务器返回编码良好的JSON。知道吗?

编辑:

我将代码粘贴到过程方法中:

系统犯错误println(“TEST”System.getProperty(“file.encoding”))
系统。犯错误println(“测试正常:”响应)
系统。犯错误println(“测试cp1250:“新字符串(response.getBytes(),“cp1250”))
系统。犯错误println(“测试UTF-8:“新字符串(response.getBytes(),“UTF-8”))

结果是这样的:

测试Cp1250
测试正常:{用户:[{登录:用户ąęśćółżń"}]}
测试cp1250:{用户:[{登录:用户ąęśćółżń"}]}
测试UTF-8:{用户:[{登录:用户????}]}

谢谢你,阿瑞克

共有1个答案

竺绍辉
2023-03-14

好吧,看起来有点奇怪http://static.springsource.org/spring/docs/3.0.x/reference/remoting.html#rest-使用springs http消息转换器的消息转换和@ResponseBody注释。我没有时间去创建自定义消息转换器,所以我的解决方案是删除@ResponseBody注释并使用如下内容:

@RequestMapping(method = RequestMethod.GET, value = "dispatcher")
public void dispatcherGet(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
    String response =  process(req, resp, session);
    try {
        resp.getWriter().write(response);
        resp.getWriter().flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

也许这能帮到别人谢谢,阿雷克

 类似资料:
  • 我收到一个标题为: 内容-长度:18588 content-type:application/json;charset=utf-8 日期:2015年12月2日星期三12:58:51 GMT 服务器:apache-coyote/1.1 在将“application/json”编码字符串发送到视图之前,是否有可能将其更改为“text/plain;charset=iso-8859-1”编码?我正在使用s

  • 我使用SpringWebFlux反应式库创建了大量RESTAPIendpoint。我现在面临的问题是,SpringWebFlux返回的响应具有传输编码:分块HTTP头。因为哪个客户端应用程序使用像Axios这样的库(https://github.com/axios/axios)浏览器javascript中基于promise的HTTP客户端失败。如何关闭传输编码:分块? Spring webflux

  • 我看到了这个问题。在Chrome/Safari中,设置为包含一些特殊字符(即西班牙语颚化符“i”)的内容的Ajax响应无法正确解释。 这里的一个例子完美地总结了这个问题: 我试过Firefox和IE,两者都很好。只有Chrome无法正确显示网页。这是URL:http://maixner.eu/#bio正如你所见,有些字符是错误的。这条线:2012-Museum moderního umÄ›ní

  • 这可能是一个奇怪的问题,尽管我想知道为什么以前没有人提出过这个问题。。。因此,如果有任何无知,请纠正我。 首先,我将Jackson与Spring和@ResponseBody注释结合使用。目前,对于每个请求处理程序,我都返回一个“Response”包装器对象,这是客户机所期望的。这个包装非常简单: 问题是,我不喜欢显式地包装所有请求处理程序的每个返回值。我也不喜欢在单元测试中打开这些响应包装。 相反

  • 我不熟悉Spring RestTemplate。 但是对于这个项目,我必须使用Spring RestTemplate发送一个POST调用来使用rest API。

  • 当结合使用SpringWebFlux和Kotlin协同程序时,我很难理解一个简单的RESTfulWS响应处理场景。假设我们在REST控制器中有一个简单的WS方法,该方法可能返回大量(数百万)响应“things”: 这正如人们所期望的那样:只要使用流媒体类型(例如“application/x-ndjson”),结果就会流式传输到客户端。在更复杂的服务调用中,也考虑了错误/警告的可能性,我希望返回以下