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

p4tfgftt  于 2021-11-01  发布在  Java
关注(0)|答案(1)|浏览(318)

我想通过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;
      }
3zwtqj6y

3zwtqj6y1#

首先,从httprequest读取数据以进行日志记录,然后作为类进行处理时会出现一个问题 HttpServletRequest 只允许读取它的内容一次,任何重复读取它的尝试都将导致异常。因此,springboot通过使用类提供了一个解决方案 ContentCachingRequestWrapper . 其思想是在过滤器中读取一次请求的整个上下文,然后将内容复制到允许多次读取的 Package 器类中。之后,使用 Package 器类(间接实现httpservletrequest)继续链。因此,现在在您的一个筛选器(必须在用contentcachingrequestwrapper替换httpservletrequest的筛选器之后配置)中,您可以读取并记录您的请求参数,稍后您仍然可以读取您的请求来处理它。我在我们的项目中实现了这一点,它就像一个魅力。这里有一些文章的链接来解释如何做到这一点。在spring中多次阅读httpservletrequest,org.springframework.web.util.contentcachingrequestwrapper的java代码示例

相关问题