用的注解aop,可以配置XML随你
首先开启注解
<!-- aspectj aop启用CGliB代理 -->
<aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true"/>
在写切点方法
@Aspect
@Component
public class SystemLogAspect {
//注入Service用于把日志保存数据库
@Resource
private LogService logService;
//本地异常日志记录对象
private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect. class);
//Controller层 切点
@Pointcut("@annotation(workshop.Common.aop.SysLog)")
public void controllerAspect() { }
/**
* 前置通知 用于拦截Controller层记录用户的操作
*
* @param joinPoint 切点
*/
// ProceedingJoinPoint
@Before("controllerAspect()")
public void doBefore(JoinPoint joinPoint) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// HttpSession session = request.getSession();
// 请求用户名 (读取shiro中保存的用户信息)
ShiroUser user = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
// 请求类
String strClassName = joinPoint.getTarget().getClass().getName();
// 请求地址
String requestURI=request.getRequestURI();
// 请求参数
StringBuffer bfParams = new StringBuffer();
Object[] params = joinPoint.getArgs();
Enumeration<String> paraNames = null;
if (params != null && params.length > 0) {
paraNames = request.getParameterNames();
String key;
String value;
while (paraNames.hasMoreElements()) {
key = paraNames.nextElement();
value = request.getParameter(key);
bfParams.append(key).append("=").append(value).append("&");
}
if (StringUtils.isBlank(bfParams)) {
bfParams.append(request.getQueryString());
}
}
// 请求的IP
String ip= WebUtils.getRemoteAddr(request);
try {
// System.out.println("=====前置通知开始=====");
// 获取操作名称
String operation=getControllerMethodDescription(joinPoint);
// 获取登录用户名
String loginName=user.name;
Log log=new Log();
log.setLoginName(loginName);
log.setOperationName(operation);
log.setOperationClass(strClassName);
log.setOperationAddress(requestURI);
log.setParams(bfParams.toString());
log.setIp(ip);
log.setCreateTime(MyUtil.getNowDateStr2());
//*========保存数据库日志=========*//
//System.out.println(log);
// 保存数据库
System.out.println("执行保存操作前");
logService.insertLog(log);
System.out.println("执行保存操作后");
} catch (Exception e) {
//记录本地异常日志
logger.error("==前置通知异常==");
logger.error("异常信息:{}", e.getMessage());
}
}
/**
* 获取注解中对方法的描述信息 用于Controller层注解
*
* @param joinPoint 切点
* @return 方法描述
* @throws Exception
*/
public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(SysLog.class).value();
break;
}
}
}
return description;
}
}
再写自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
放到控制器上即可
@SysLog(value = "资源信息查看")
@RequiresPermissions("resource:list")
@RequestMapping(value = "/manager", method = RequestMethod.GET)
public String manager() {
return "resource/resource";
}