【问题标题】:How to intercept HttpServletRequest with Spring MVC Jackson如何使用 Spring MVC Jackson 拦截 HttpServletRequest
【发布时间】:2015-02-25 16:42:06
【问题描述】:

我正在使用 Spring/Jackson 将 json 自动转换为 POJO。一切工作正常,除非我进行标头身份验证(使用过滤器)。我一直在使用 request.getContentLength() 来获取 json 字符串的长度。

这工作正常,直到 json 包含一个变音符号。然后内容长度报告为长一个字符。所以很明显我必须得到实际的json主体。这被证明是困难的,因为调用 request.getInputStream 会导致 Jackson 失败,因为输入流已经关闭。 getReader 也一样。

所以,我已经按照此博客中的说明完成了:http://natch3z.blogspot.co.uk/2009/01/read-request-body-in-filter.html

这有效,但不能正确编码为 UTF-8。所以我替换了这一行:

  bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

到:

  bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

在我的日志中显示正确的 json,但是当 jackson 尝试转换为 pojo 时出现此错误:

 nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 start byte 0x9f 

如果有人有任何想法,我不知道如何让它工作?

【问题讨论】:

  • 你需要提前知道你的filter中json字符串的长度吗?只是想知道是否有可能绕过实际问题......
  • 是的,我需要 json 长度。我在下面发布了解决方案。感谢该博客,因为它只需要我展示的一个小调整即可工作。

标签: java json spring spring-mvc jackson


【解决方案1】:

我刚刚想通了:

我替换了这一行:

final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());

用这个:

final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));

我应该早点意识到,但这可能会帮助遇到类似问题的其他人。

【讨论】:

    猜你喜欢
    • 2018-01-07
    • 2014-05-19
    • 1970-01-01
    • 2013-06-21
    • 2012-09-02
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多