我這邊自己嘗試的寫了一個簡單的權限管理
是用AspectJ 來實現的
非常的方便 要不spring 原裝的aop方便的多
在aspectJ的配置方面我就不都說了 在我的博文裏有介紹
先介紹下我這個demo 背景是物業權限管理
實現的原理是通過註解來實現的
包的分佈是這樣的
我們首先需要自定義自己的註解來 和自己對應的相關value值代表什麼的編碼表(這個需要自己根據業務來實現)
package com;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by m1867 on 2016/10/28.
*/
@Target(ElementType.METHOD)//這個註解是應用在方法上
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {
/**
* 權限值
* @return
*/
String value() default "";
}
這個就是註解 注意我們需要在我們自定義的註解上 定義它的相關信息
尤其是這個
@Retention(RetentionPolicy.RUNTIME)
表示jvm運行時,此註解可被讀
這樣我們才能通過反射來實現解讀這個註解
之後是定義我們的 .aj 也就是 aspect 文件
package com;
import org.aspectj.lang.reflect.MethodSignature;
import java.lang.reflect.Method;
/**
* Created by m1867 on 2016/10/28.
*/
public aspect SampleAspect {
/**切入點 攔截所有的有@AuthCeck註解的方法*/
public pointcut serviceAuthCheckAnnotatedMethods(): @annotation(AuthCheck);
/**
*這個切入點的代理類 我們可以輸出我們想要的 或者是直接拋出異常也是可以的
* */
before(): serviceAuthCheckAnnotatedMethods(){
System.out.println(YjtxCtrl.XQADMIN);
MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
Method method = methodSignature.getMethod();
if (method.isAnnotationPresent(AuthCheck.class)) {
//得到方法上的註解
AuthCheck authCheck = method.getAnnotation(AuthCheck.class);
String methodAccess = authCheck.value();
System.out.println(methodAccess);
if("YG".equals(methodAccess)){
System.out.println("YG");
throw
}else if("XQADMIN".equals(methodAccess)){
System.out.println("XQADMIN");
}else if("WYADMIN".equals(methodAccess)){
System.out.println("WYADMIN");
}else if("PTADMIN".equals(methodAccess)){
System.out.println("PTADMIN");
}else{
throw new IllegalStateException("權限不足");
System.out.println("wu");
}
}
throw new IllegalStateException("權限不足");
System.out.println("沒有找到");
}
}
合格.aj文件是AspectJ 文件 你可以把這個.aj文件看成是我們原先在Spring AOP 中的代理類和在xml配置切點的結合
非常的方便
這連個寫好之後就可以寫我們的controller 和test
package com;
/**
* Created by m1867 on 2016/10/28.
*/
public class YjtxCtrl {
public static final int XQADMIN=5;
public int add(int x, int y) {
return x + y;
}
@AuthCheck(value = "XQADMIN")
public String getPassword(String username) {
return "password";
}
}
test
package com;
import org.junit.Test;
/**
* Created by m1867 on 2016/10/28.
*/
public class test {
@Test
public void test(){
YjtxCtrl yjtxCtrl = new YjtxCtrl();
/*yjtxCtrl.add(5,6);*/
System.out.println(yjtxCtrl.getPassword("6666"));
}
}
ok demo就全部在這裏了 希望可以能幫助大家
這個我也是感慨是學兩天 具體有什麼不足的地方也希望能幫忙指出來
最後
感謝網絡上的大牛和前輩的幫助 及分享的知識 謝謝
@Retention(RetentionPolicy.RUNTIME)