spring-AOP實戰(最新,實用,簡單,爆炸!!!!!)
阿新 • • 發佈:2019-02-05
廢話不多說直接開始幹
(注:本文前提是你已經倒入了其他啟動專案所有需要的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的時候才能正確返回
測試效果你們自己來~~穩穩的不叭叭,用的好請點贊