AspectJ - 记录HttpServletRequest

时间:2013-01-11 17:24:31

标签: java spring aspectj spring-aop

我想劫持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]

1 个答案:

答案 0 :(得分: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) {
  //...