当前位置: 首页 > 知识库问答 >
问题:

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

景鸿才
2023-03-14

我想通过Spring过滤器或方面记录超文本传输协议请求中的请求参数。我尝试了不同的方法,但请求参数为空或未调用方法。我使用的是POSTMAN,它是一个POST请求。

http://localhost:8080/available data

请求正文示例:

{“keyUserAgent”:“CFNetwork/1209 Darwin/20.2.0”,“locale”:“en_US”,“eid”:“8904977033”,“sessionId”:“VGA-G2020201030-776878787-1AD5-11EB-895C-H78789GJJH”}

方法1:这里调用了request()之前的“@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个答案

寇和璧
2023-03-14

首先,从HttpRequest中读取数据以进行日志记录和后续处理存在一个问题,因为类< code>HttpServletRequest只允许读取其内容一次,任何重复读取它的尝试都会导致异常。因此,spring boot通过使用类< code > ContentCachingRequestWrapper 提供了一个解决方案。其思想是在过滤器中一次性读取请求的整个上下文,并将内容复制到允许多次读取的包装类中。之后,您继续使用您的包装类(间接实现HttpServletRequest)的链。现在,在您的一个过滤器(必须在用ContentCachingRequestWrapper替换HttpServletRequest的过滤器之后配置)中,您可以读取并记录您的请求参数,稍后您还可以读取您的请求以处理它。我在我们的项目中实现了这一点,效果非常好。这里有一些解释如何做的文章的链接。在Spring中多次读取HttpServletRequest,org . Spring framework . web . util . contentcachingrequestwrapper的Java代码示例

 类似资料:
  • 我试图在spring boot应用程序中配置的过滤器中获取请求中的Traceid以进行审计。 我们如何从过滤器中的请求中获取Traceid

  • 问题内容: 我定义了一个,并且具有带有Spring注释的Java类。 我想将Bean 放入我的,因此尝试了以下操作: 但是它总是返回。我怎样才能得到一个Spring bean? 问题答案: 尝试: 你的bean在应用程序上下文中的名称/标识在哪里。甚至更好: 还可以看看GenericFilterBean及其子类。

  • 问题内容: Spring MVC-如何在Spring控制器中获取地图中的所有请求参数?范例网址: 我不知道attr1,att2和attr4的名称。 我希望能够做类似的事情(或类似的,不在乎,只要我可以访问Map的请求参数名-> value: 如何使用Spring MVC做到这一点? 问题答案: 尽管其他答案是正确的,但肯定不是直接使用HttpServletRequest对象的“spring方式”。

  • 在play framework Java中找不到传入请求的请求体。我需要在play framework API中记录所有传入请求。为此,我尝试使用滤镜和动作组合。但我能得到请求体。 我尝试使用滤镜和动作组合。 从这个请求中,我可以得到body是否存在的布尔值。但却无法得到真正的尸体。

  • 问题内容: 如何从JavaScript请求中获取“ GET”变量? 是jQuery还是YUI!内置此功能吗? 问题答案: 所有数据均在 您必须解析字符串,例如。 只需以GET变量名作为参数调用该函数,例如。 如果变量没有值或不存在,则此函数将返回变量value或undefined

  • 我正在处理一个安全过滤器,它需要根据path变量的值做一些检查。我试着这样做: 但映射始终为空,因此我的筛选器的优先级似乎高于在请求中填充属性的。 我已尝试添加以下配置: 这没有帮助,筛选器是在调用之前执行的。 在我的安全过滤器中,我获取Auth头,解密它,从中获取并将它与路径var值进行比较。如果这些ID不匹配,我返回403。 我想知道是否有可能覆盖这两个动作的顺序。或者,也许,有其他的方法来检