Java 如何使用Spring MVC拦截HttpServletRequest

Java 如何使用Spring MVC拦截HttpServletRequest,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我正在使用Spring/Jackson将json自动转换为POJO。所有这些都可以正常工作,除了在执行头身份验证(使用过滤器)时。我一直在使用request.getContentLength()获取json字符串的长度 这很好,直到json包含变音字符。其中,内容长度报告为长一个字符。显然,我必须得到实际的json主体。这很困难,因为调用request.getInputStream会导致Jackson失败,因为输入流已经关闭。getReader也是如此 因此,我已经完成了本博客中概述的工作: 它

我正在使用Spring/Jackson将json自动转换为POJO。所有这些都可以正常工作,除了在执行头身份验证(使用过滤器)时。我一直在使用request.getContentLength()获取json字符串的长度

这很好,直到json包含变音字符。其中,内容长度报告为长一个字符。显然,我必须得到实际的json主体。这很困难,因为调用request.getInputStream会导致Jackson失败,因为输入流已经关闭。getReader也是如此

因此,我已经完成了本博客中概述的工作:

它可以工作,但不能正确编码到UTF-8。所以我换了这一行:

  bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
致:

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

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

如果有人有什么想法的话,我不知道如何让它工作?

我只是想了一下:

我替换了这一行:

  bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
为此:

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

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

您需要提前知道过滤器中json字符串的长度吗?只是想知道是否有可能绕过实际问题…是的,我需要json长度。。我已经在下面发布了解决方案。这要归功于我的博客,因为我只做了一点小小的调整。