如何在Spring过滤器中获取请求体参数?

vic*_*cky 3 java spring request http-request-parameters spring-boot

我想通过Spring过滤器aspect记录HTTP请求中的请求参数。我尝试了不同的方法,但要么请求参数被调用null,要么方法未被调用。

我正在使用 Postman,这是一个POST请求。


示例请求网址:

http://localhost:8080/AvailableData

请求正文示例:

{
    "keyUserAgent": "CFNetwork/1209 Darwin/20.2.0",
    "locale": "en_US",
    "eid": "8904977033",
    "sessionId": "VGA-G20201030-776878787-1AD5-11EB-895C-H78789GJJH"
}
Run Code Online (Sandbox Code Playgroud)

选项1

这里调用@Override的方法beforeRequest(),但不会调用我创建的重载方法(我添加了@RequestBody按照其他解决方案获取正文)。

{
    "keyUserAgent": "CFNetwork/1209 Darwin/20.2.0",
    "locale": "en_US",
    "eid": "8904977033",
    "sessionId": "VGA-G20201030-776878787-1AD5-11EB-895C-H78789GJJH"
}
Run Code Online (Sandbox Code Playgroud)

选项2

在这里它是这样的null

@Component
public class CustomLoggingFilter extends AbstractRequestLoggingFilter {

    protected void beforeRequest(HttpServletRequest request, String message, @RequestBody RequestDTO requestBody) {
        requestBody.getKeyUserAgent();
        requestBody.getEid();
        System.out.println("Eid: " + requestBody.getEid());
        System.out.println("getKeyUserAgent: " + requestBody.getKeyUserAgent());
    }

}
Run Code Online (Sandbox Code Playgroud)

Mic*_*man 8

首先,从日志中读取数据HttpRequest并随后进行处理存在问题,因为类HttpServletRequest只允许读取其内容一次,并且任何重复尝试读取它都会导致Exception.

因此,Spring Boot 通过使用 class 提供了一个解决方案ContentCachingRequestWrapper。这个想法是,您在过滤器中读取一次请求的整个上下文,并将内容复制到允许多次读取的包装类中。之后,您可以使用包装类(间接实现HttpServletRequest)继续该链。

HttpServletRequest因此,现在在您的一个过滤器中(必须在替换为的过滤器之后进行配置,ContentCachingRequestWrapper您可以读取并记录您的请求参数,稍后您仍然可以读取您的请求来处理它。我在我们的项目中实现了这一点,它的工作原理就像魅力。

以下是解释如何执行此操作的文章的一些链接: