4

我想劫持一个 HTTPServletRequest 并使用 AspectJ 从中记录一些值。然而,最终在 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]
4

2 回答 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) {
  //...
于 2013-01-11T17:47:31.160 回答
1

使用RequestContextHolder喜欢

HttpServletRequest request = ((ServletRequestAttributes) 
RequestContextHolder.getRequestAttributes()).getRequest();
于 2018-05-11T07:49:03.360 回答