我想通过spring过滤器或aspect在http请求中记录请求参数。我尝试了不同的方法,但要么请求参数为null,要么方法未被调用。我用的是 Postman ,这是一个邮寄请求
http://localhost:8080/可用数据
请求正文示例:
{“keyuseragent”:“cfnetwork/1209 darwin/20.2.0”,“locale”:“en\u us”,“eid”:“8904977033”,“sessionid”:“vga-g20201030-7768787-1ad5-11eb-895c-h789gjjh”}
方法1:这里调用了beforerequest()的“@override”方法,但没有调用我创建的重载方法(我添加了@requestbody,以便按照其他解决方案获取正文)。
@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());
}
}
方法2:这里它是空的
@Aspect
@Component
@Order(1)
public class LogAspect {
private final static Logger logger = LoggerFactory.getLogger(LoggerAspect.class);
@Around("allControllerMethods() && args(..,@annotation(org.springframework...RequestBody) requestBody) ")
public Object controllerEvents(ProceedingJoinPoint jp, Object requestBody) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MethodSignature signature = (MethodSignature) jp.getSignature();
Method method = signature.getMethod();
Object resObject = jp.proceed();
Object sessionId = attributes.getSessionId()
if (requestBody != null) {
String keyUserAgent = request.getParameter("keyUserAgent");
System.out.println("keyUserAgent : " + keyUserAgent);
}
return resObject;
}
1条答案
按热度按时间3zwtqj6y1#
首先,从httprequest读取数据以进行日志记录,然后作为类进行处理时会出现一个问题
HttpServletRequest
只允许读取它的内容一次,任何重复读取它的尝试都将导致异常。因此,springboot通过使用类提供了一个解决方案ContentCachingRequestWrapper
. 其思想是在过滤器中读取一次请求的整个上下文,然后将内容复制到允许多次读取的 Package 器类中。之后,使用 Package 器类(间接实现httpservletrequest)继续链。因此,现在在您的一个筛选器(必须在用contentcachingrequestwrapper替换httpservletrequest的筛选器之后配置)中,您可以读取并记录您的请求参数,稍后您仍然可以读取您的请求来处理它。我在我们的项目中实现了这一点,它就像一个魅力。这里有一些文章的链接来解释如何做到这一点。在spring中多次阅读httpservletrequest,org.springframework.web.util.contentcachingrequestwrapper的java代码示例