spring aop 中使用@Aspect掃描註解用作(權限或特殊處理)

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;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章