捕获登录用户页面访问/点击图像/超链接/按钮 - 用户活动审计跟踪

时间:2014-11-19 06:13:05

标签: java spring spring-mvc aspectj audit-trail

目前我们正处于产品的开发阶段,坦率地说,已经编写了许多控制器/服务。我们正在使用Spring MVC, Core, Aspect, Security etc along with Hibernate, JQuery等。

现在我们需要捕获登录用户活动,例如按钮点击,菜单点击,超链接点击等。

一种方法是使用Spring Aspect,并创建我自己的annotation或在春天使用内置(如果有的话)。但问题是,我必须手动将其添加到我的应用程序中的所有控制器。阅读this

在处理请求时,Global level上有一些可用于调度程序servlet的地方。 (就像@ControllerAdvice with @ExceptionHandler

1 个答案:

答案 0 :(得分:2)

Spring AOP或AspectJ中的切入点不仅可以基于手动添加的注释,还可以基于您想要拦截的方法的其他常见特征,例如

  • 包名称模式,
  • 班级名称模式,
  • 方法名称模式,
  • 方法签名(某些参数类型),
  • 类层次结构(例如,制定某个类或接口的所有子类)

及其任何组合。你可能会相处得很远。但是为了给出更具体的答案,我必须更多地了解你的代码。


更新:既然您告诉我共同点,我就有了一个想法:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.web.bind.annotation.RequestMapping;

public aspect RequestMappingInterceptor {
    @Pointcut(
        "within(@org.springframework.stereotype.Controller *) && " +
        "@annotation(requestMapping) && " +
        "execution(* *(..))"
    )
    public void controller(RequestMapping requestMapping) {}

    @Before("controller(requestMapping)")
    public void advice(RequestMapping requestMapping, JoinPoint thisJoinPoint) {
        System.out.println(thisJoinPoint);
        System.out.println("  " + requestMapping);
        System.out.println("  " + requestMapping.method()[0]);
    }
}

此示例拦截所有控制器中的所有公共方法,并另外将请求映射注释绑定到您可以轻松评估的参数。