我想劫持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]
答案 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) {
//...