1. 程式人生 > >spring-AOP實戰(最新,實用,簡單,爆炸!!!!!)

spring-AOP實戰(最新,實用,簡單,爆炸!!!!!)

廢話不多說直接開始幹

(注:本文前提是你已經倒入了其他啟動專案所有需要的spring包,且配置好)

沒有的話請去我的github下載(包含aopdemo):下載專案

第一步:倒入AOP相關jar包,本文實用POM

                <spring.version>4.1.1.RELEASE</spring.version>
                <aspectj.version>1.6.11</aspectj.version>
                <!--spring aop包 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
                <!--使用AspectJ方式註解需要相應的包 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${aspectj.version}</version>
		</dependency>
		<!--使用AspectJ方式註解需要相應的包 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${aspectj.version}</version>
		</dependency

第二步:編寫切點(本文使用自定義標籤)

廢話不多說,上手直接幹。

自定義一個註解:作為每次切入的點

@Target,這個修飾 用來說明該註解可以被宣告在那些元素之前。(詳情我等在發篇部落格解答)

ElementType.METHOD:說明該註解只能被宣告在一個類的方法前。

@Retention,這個修飾用來說明該註解的生命週期

RetentionPolicy.RUNTIME  : 註解保留在程式執行期間,此時可以通過反射獲得定義在某個類上的所有註解

import java.lang.annotation.Retention;
@AuthChecker
	@RequestMapping(value = "/aop/http/user_info")
	public String callSomeInterface() {
		return "ok in user_info.";
	}

import java.lang.annotation.Target;import java.lang.annotation.ElementType;import java.lang.annotation.ElementType.METHOD;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface AuthChecker {}

第三步:編寫切面

直接上程式碼不逼逼,

下面切面是一個驗證登入token的小方法,其他方法修改切面內容就可以

@Around,註解是環繞通知

其他通知相同:

@Before,@After等。。。。

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Component
@Aspect
public class HttpAopAdviseDefine {

	// 定義一個 Pointcut, 使用 切點表示式函式 來描述對哪些 Join point 使用 advise.
	@Pointcut("@annotation(com.shen.utils.AuthChecker)")
	public void pointcut() {
	}

	// 定義 advise
	@Around("pointcut()")
	public Object checkAuth(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("成功進入標籤切面");
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
				.getRequest();

		// 檢查使用者所傳遞的 token 是否合法
		String token = getUserToken(request);
		if (!token.equalsIgnoreCase("123456")) {
			return "erro,no in!";
		}

		return joinPoint.proceed();
	}

	private String getUserToken(HttpServletRequest request) {
		Cookie[] cookies = request.getCookies();
		if (cookies == null) {
			return "";
		}
		for (Cookie cookie : cookies) {
			if (cookie.getName().equalsIgnoreCase("user_token")) {
				return cookie.getValue();
			}
		}
		return "";
	}
}

第三步:使用註解

@AuthChecker
	@RequestMapping(value = "/aop/http/user_info")
	public String callSomeInterface() {
		return "ok in user_info.";
	}

http請求就看到結果,被攔截,只有當有引數token=123456的時候才能正確返回

測試效果你們自己來~~穩穩的不叭叭,用的好請點贊