Spring MVC在控制器之前获取POST正文

时间:2019-03-20 13:53:57

标签: java spring rest spring-mvc post

我需要阅读POST请求正文而不消耗它。

我已经在我的自定义HandlerInterceptor中以多种方式对其进行了尝试,但没有任何效果。在某些时候,我尝试包装和缓存请求正文的所有操作均无效,甚至可能是因为我无法控制Spring的功能。

所以我想到了另一件事:Spring会在某个时候尝试将请求主体映射到一个对象,并将其传递给正确的Controller。我可以在调用Controller之前拦截该操作并获取该对象吗?

2 个答案:

答案 0 :(得分:0)

一旦在到达控制器之前从请求中读取了请求正文,您将无法在任何地方使用它。因此,您可以做的是在HttpServletRequest实现中从Filter读取正文,并在ThreadLocal变量中进行设置。然后,您可以从该ThreadLocal中读取内容。下面是示例代码。

内部Filter实现类

try {
    YourModel yourModel = // Read the request body

    RequestContextHolder.setContext(yourModel);
}finally {
    RequestContextHolder.clearContext();
}

,在当前请求中的任何时间点,您都可以执行以下操作。

RequestContextHolder.getContext();

这是RequestContextHolder

public class RequestContextHolder {

    private static final ThreadLocal<YourModel> THREAD_LOCAL = new ThreadLocal<>();

    public static void setContext(YourModel yourModel) {
        THREAD_LOCAL.set(yourModel);
    }

    public static YourModel getContext() {
       return THREAD_LOCAL.get();
    }

    public static void clearContext() {
       THREAD_LOCAL.remove();
    }
}

答案 1 :(得分:0)

我找到了一个解决方案:使用CommonsRequestLoggingFilter,Spring甚至可以记录请求的有效负载。我发现的唯一麻烦是我只能在afterRequest方法中读取有效负载,因为在beforeRequest中不存在。

有关CommonsRequestLoggingFilter here的更多信息。