需求:每個接口都會去判斷當前用戶的權限是否能訪問。當前用戶共有3類角色權限,分別為普通用戶(ordinaryUser),貴賓用戶(vipUser),超級用戶(superUser),優先級依次遞增。
分析:可在每個控制器類上加上注解,該注解即代表控制器類中每個接口的被訪問權限。若想修改具體接口的權限,可在接口上加上注解。即控制器類中接口的權限優先級 > 控制器類的權限。
實現:
1.定義一個常量類,保存3種不同的角色權限。
/** * 常量類 * * @author xxwu*/ public class ConstantClass{ /** * 普通用戶 */ public static final String ORDINARY_USER = "ordinaryUser"; /** * 貴賓用戶 */ public static final String VIP_USER = "vipUser"; /** * 超級用戶 */ public static final String SUPER_USER= "superUser"; }
2.自定義一個注解類
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface UserAuthority { /** * 默認權限為普通用戶 * * @return */ String[] role() default ConstantClass.ORDINARY_USER;
}
3.在控制器接口類上 或 接口方法上加上注解
@UserAuthority(role = {ConstantClass.ORDINARY_USER,ConstantClass.VIP_USER})
4.獲取接口類上或者接口方法上自定義注解權限的值
import org.springframework.web.method.HandlerMethod;
String[] roles = null; //用戶權限優先級:方法 > 類,以優先級高為准。 if (object instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) object; UserAuthority userAuthority = handlerMethod.getMethodAnnotation(UserAuthority.class); if (userAuthority != null) { //獲取方法注解上的用戶權限 roles = userAuthority.role(); } if ((roles == null || roles.length <= 0) && handlerMethod.getMethod().getDeclaringClass() != null) { userAuthority = handlerMethod.getMethod().getDeclaringClass().getAnnotation(UserAuthority.class); if (userAuthority != null) { /獲取類注解上的用戶權限 roles = userAuthority.role(); } } }
✿✿ヽ(°▽°)ノ✿
一:元注解:
1.@Target:表明該注解可以應用到的元素類型
Target類型 | 描述 |
---|---|
Element.TYPE |
應用於類、接口(包括注解類型)、枚舉 |
Element.FIELD |
應用於屬性(包括枚舉中的常量) |
Element.METHOD |
應用於方法 |
Element.PARAMETER |
應用於方法的形參 |
Element.CONSTRUCTOR |
應用於構造函數 |
Element.LOCAL_VARIABLE |
應用於局部變量 |
Element.ANNOTATION_TYPE |
應用於注解類型 |
Element.PACKAGE |
應用於包 |
Element.TYPE_PARAMETER |
應用於類型變量 |
Element.TYPE_USE |
應用於任何使用類型的語句中(例如聲明語句、泛型和強制轉換語句中的類型) |
2.@Retention:表明注解的生命周期
生命周期 | 描述 |
RetentionPolicy.SOURCE | 編譯時被丟棄,不包含在類文件中 |
RetentionPolicy.CLASS | JVM加載時被丟棄,包含在類文件中,默認值 |
RetentionPolicy.RUNTIME | 由JVM 加載,包含在類文件中,在運行時可以被獲取到 |
二:類的動態加載和靜態加載
區別:靜態加載的類的源程序在編譯時期加載(必須存在),而動態加載的類在編譯時期可以缺席(源程序可以不存在)。