jar包:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
spring-mvc.xml
<context:component-scan base-package="demo"/>
<aop:config proxy-target-class="true" />
<aop:aspectj-autoproxy />
control demo:
package demo;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public class DemoInterceptor {
static Integer count = 0;
// 切入點要攔截的類 聲明一個切入點,切入點的名稱其實是一個方法
@Pointcut("@annotation(註解的全路徑.註解類A) || @annotation(註解的全路徑.註解類B)")
private void anyMethod() {
}
// 環繞通知(攔截)
@Around("anyMethod()")
public Object trackInfo(ProceedingJoinPoint jp) throws Throwable {
Signature signature = jp.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod();
// 對於有註解的方法進行權限驗證
boolean b = targetMethod.isAnnotationPresent(註解類A.class);
boolean c = targetMethod.isAnnotationPresent(註解類B.class);
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getResponse();
if (b) {// 帶有註解類A攔截
註解類A a= targetMethod.getAnnotation(註解類A.class);
//a. 獲取參數
//業務處理
}
if (c) {// 帶有註解類B攔截
註解類B b= targetMethod.getAnnotation(註解類B.class);
//b. 獲取參數
//業務處理
}
Object object = jp.proceed();
return object;
}
}