[英]Spring MVC Get POST body before controllers
我需要读取POST请求正文而不消耗它。
我在我的自定义HandlerInterceptor中以多种方式尝试过它并且没有任何效果。 在某些时候,所有我试图包装和缓存请求主体都没有用,可能是因为我无法控制Spring的功能。
所以我想到了另一件事:在某些时候,Spring会尝试将请求主体映射到一个对象并将其传递给正确的Controller。 我可以拦截这个动作并在调用Controller之前获取该对象?
在到达控制器之前从请求中读取请求主体后,您无法在任何地方使用。 所以你可以做的是从Filter
实现中的HttpServletRequest
读取body并在ThreadLocal
变量中设置它。 然后你可以从那个ThreadLocal
读取。 下面是示例代码。
Inside 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();
}
}
我找到了一个解决方案:使用CommonsRequestLoggingFilter Spring可以记录请求的有效负载。 我发现的唯一麻烦是我只能在afterRequest方法中读取有效负载,因为在beforeRequest中没有。
有关CommonsRequestLoggingFilter的更多信息,请点击此处 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.