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)
这里调用@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)
在这里它是这样的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)
首先,从日志中读取数据HttpRequest并随后进行处理存在问题,因为类HttpServletRequest只允许读取其内容一次,并且任何重复尝试读取它都会导致Exception.
因此,Spring Boot 通过使用 class 提供了一个解决方案ContentCachingRequestWrapper。这个想法是,您在过滤器中读取一次请求的整个上下文,并将内容复制到允许多次读取的包装类中。之后,您可以使用包装类(间接实现HttpServletRequest)继续该链。
HttpServletRequest因此,现在在您的一个过滤器中(必须在替换为的过滤器之后进行配置,ContentCachingRequestWrapper您可以读取并记录您的请求参数,稍后您仍然可以读取您的请求来处理它。我在我们的项目中实现了这一点,它的工作原理就像魅力。
以下是解释如何执行此操作的文章的一些链接:
| 归档时间: |
|
| 查看次数: |
15292 次 |
| 最近记录: |