我需要阅读POST请求正文而不消耗它。
我已经在我的自定义HandlerInterceptor中以多种方式对其进行了尝试,但没有任何效果。在某些时候,我尝试包装和缓存请求正文的所有操作均无效,甚至可能是因为我无法控制Spring的功能。
所以我想到了另一件事:Spring会在某个时候尝试将请求主体映射到一个对象,并将其传递给正确的Controller。我可以在调用Controller之前拦截该操作并获取该对象吗?
答案 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的更多信息。