一.配置
- 引入jar包
pom配置如下,没有使用maven的话,自己去http://mvnrepository.com/下载.jar文件。
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
- 在dispatcher-servlet.xml中加入下面配置:
<!-- 激活组件扫描功能,在包com.kylin.drugmng.aop及其子包下面自动扫描通过注解配置的组件
base-package配置的是切面类所在的包路径
-->
<context:component-scan base-package="com.kylin.drugmng.aop"/>
<!-- 激活自动代理功能 -->
<!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
<aop:aspectj-autoproxy/>
并且我们需要在xml的根目录beans下引用aop的命名空间和xsi
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop"
注意:
1.项目中会有多个.xml配置文件,根据个人习惯不同配置文件会有不同的名字。
如何找到正确的dispatcher-servlet.xml?打开web.xml文件,找到以下配置:
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
这个项目的spring-mvc.xml就是dispatcher-servlet.xml。所以这个项目的AOP配置要加在spring-mvc.xml中。
二.使用
- 编写切面类
package com.kylin.drugmng.aop;
import java.util.Arrays;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.tomcat.jni.User;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.kylin.drugmng.service.LogService;
@Aspect
@Component
public class ControllerAspect {
@Autowired
private LogService logService;
private static Logger log = LogManager.getLogger(ControllerAspect.class);
/*配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
com.kylin.drugmng.controller包下的任何类中的任何方法执行之前都会进入切面
*/
@Pointcut("execution(* com.kylin.drugmng.controller..*(..))")
public void aspect(){ }
/*
* 配置前置通知,使用在方法aspect()上注册的切入点
* 同时接受JoinPoint切入点对象,可以没有该参数
*/
@Before("aspect()")
public void permissionCheck(JoinPoint point) throws Throwable {
//获取调用的controller的类名
String className = point.getSignature().getDeclaringType().getSimpleName();
// 获取调用的controller类中的方法名
String methodName = point.getSignature().getName();
String operation = className + "." + methodName;
log.info("控制器" + className + "." + methodName + "入参:" + Arrays.toString(point.getArgs()));
// 获取方法中的参数
Object[] args = point.getArgs();
//参数去前后空格
for(int i=0;i<args.length;i++){
if(args[i]!=null){
args[i] =StringUtils.trim(args[i].toString());
}
}
if (args.length > 0 && args[args.length - 1] instanceof HttpSession) {
HttpSession session = (HttpSession) args[args.length - 1];
User user = (User) session.getAttribute("user");
if (user != null) {
logService.saveSystemLog(user, operation, 0);
}
else {
log.info("未知用户进行" + operation + "操作!");
}
}
}
}