我想劫持一个 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]
最佳答案
HttpServletRequest
是一个接口(interface)。每个 servlet 容器都有自己的实现。 org.apache.catalina.connector.RequestFacade
就是其中之一。
话虽如此,您可以自由使用 HttpServletRequest
的任何方法,而无需担心实际实现。Service.testAuditRecord()
的签名是什么?它是否以 HttpServletRequest
作为参数?如果是这样,AspectJ 应该会给你一个没有太多麻烦的强类型实例。试试这个:
@Before("execution(* Service.testAuditRecord(..)) && args(request)")
public void logBefore(JoinPoint joinPoint, HttpServletRequest request) {
//...
关于java - AspectJ - 记录 HttpServletRequest,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14283429/