【问题标题】:How to obtain HTTPServletRequest in AspectJ如何在 AspectJ 中获取 HTTPServletRequest
【发布时间】:2011-09-17 23:48:18
【问题描述】:

我需要为一些不在 web 层的业务方法添加一些审计日志。要求之一是在此审计日志中存储执行业务方法的用户和远程终端的 IP。我决定使用 AspectJ 来审核所有这些方法,以避免在没有业务代码的情况下污染它们。 (注意:我没有使用 Spring,这是一个旧的 Struts 1 webapp)

public void myMethod(Object param, HttpRequest request**){
     //Bussiness code that never use request param
}

@After("bla bla matches myMethod")
public void myAdvice(JoinPoint jp){
    Object request = (HttpServletRequest)jp.getArgs()[1];
    //bla bla using the request to get user and IP
}

所以我的问题是,是否有人建议以更好或更优雅的方式获得建议中的 Servlet 请求?事实上,myMethod 不包含审计代码(这非常好),但现在有第二个参数,该方法不直接使用该参数,可能会使其他开发人员感到困惑。请不要建议我建议 Servlet 而不是业务方法。

【问题讨论】:

  • 或许你可以使用 this() 或 args() 切入点。

标签: servlets aspectj


【解决方案1】:

myMethod 记录 IP 已经将该方法与 Web 层(或至少具有有意义的 IP 地址的层)联系起来。 HttpServletRequest 显然是不合适的,但提供有关调用上下文的“有用”信息的实现将是合适的。

如果目标是删除 any 额外参数到myMethod,我的第一个想法是创建一个RequestProcessor,将“有用”信息存储在ThreadLocal 中,这将由日志记录方面使用。

【讨论】:

  • 这正是我想要的。就像您说的那样,我无法将日志记录与 webtier 分离,但我不想将业务逻辑绑定到 webtier。谢谢!
猜你喜欢
  • 2010-10-31
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多