AspectJ - 记录 HttpServletRequest

4
我希望使用AspectJ获取HTTPServletRequest并记录其中的一些值,但JoinPoint中得到的是一个“RequestFacade”对象。这个对象似乎无法提供太多有用的信息。我的日志策略是否出错?如何从HttpServletRequest中获取有用的信息?如果在调用方法之前必须解包它,那么这就有点违背了我的应用程序中AOP的目的。
我正在使用Glassfish服务器,不知道这是否有所影响。
@Before("execution(* Service.testAuditRecord(..))")
public void logBefore(JoinPoint joinPoint) {
    System.out.println("logBefore  --->"  + joinPoint.getSignature().getName());
    System.out.println("logBefore--->Args : " + Arrays.toString(joinPoint.getArgs()));
}

RequestFacade记录

INFO: logBefore  --->testAuditRecord
INFO: logBefore--->Args : [org.apache.catalina.connector.RequestFacade@4dbfa7d0]
2个回答

3

HttpServletRequest 是一个接口,每个 Servlet 容器都有自己的实现。其中之一是 org.apache.catalina.connector.RequestFacade

也就是说,您可以自由使用 HttpServletRequest 的任何方法,而不必关心其实际实现。

Service.testAuditRecord() 的签名是什么?它是否以 HttpServletRequest 作为参数?如果是这样,AspectJ 应该会给您一个强类型的实例,而几乎没有任何麻烦。请尝试:

@Before("execution(* Service.testAuditRecord(..)) && args(request)")
public void logBefore(JoinPoint joinPoint, HttpServletRequest request) {
  //...

1
使用RequestContextHolder,如下所示:
HttpServletRequest request = ((ServletRequestAttributes) 
RequestContextHolder.getRequestAttributes()).getRequest();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接