1. 程式人生 > >使用springmvc攔截器+自定義註解做許可權管理

使用springmvc攔截器+自定義註解做許可權管理

1、自定義註解:
這裡寫圖片描述
如圖:@Target說明了Annotation所修飾的物件範圍:Annotation可被用於 packages、types(類、介面、列舉、Annotation型別)、型別成員(方法、構造方法、成員變數、列舉值)、方法引數和本地變數(如迴圈變數、catch引數)。在Annotation型別的宣告中使用了target可更加明晰其修飾的目標。
取值(ElementType)有:
1.CONSTRUCTOR:用於描述構造器
2.FIELD:用於描述域
3.LOCAL_VARIABLE:用於描述區域性變數
4.METHOD:用於描述方法
5.PACKAGE:用於描述包
6.PARAMETER:用於描述引數
7.TYPE:用於描述類、介面(包括註解型別) 或enum宣告

@Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在原始碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中;編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命週期”限制。
取值(RetentionPoicy)有:
1.SOURCE:在原始檔中有效(即原始檔保留)
2.CLASS:在class檔案中有效(即class保留)
3.RUNTIME:在執行時有效(即執行時保留)

還有兩個元註解:@Documented:用於描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。Documented是一個標記註解,沒有成員。
@Inherited :是一個標記註解,闡述了某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個annotation將被用於該class的子類。

default是註解元素authority的預設值,若不指定authority的值,則authority為”“。

2、這裡寫圖片描述
關於springmvc攔截器的具體實現原理等,我就不贅述了,我寫的程式碼也通俗易懂,大家看看就明白了。
在這裡可以獲取請求引數的具體資訊,我是根據request獲取到使用者的編號,去資料庫查詢使用者的所有許可權,然後通過
HandlerMethod method = (HandlerMethod) handler;
AuthorityAnnotation auth = method.getMethod().getAnnotation(AuthorityAnnotation.class);
獲取方法上的自定義註解的值,再通過PrintWriter返回json格式的訊息內容。

當然,springmvc的攔截器要在springmvc的配置檔案中配置<mvc:interceptors>標籤,如下圖,大家看註釋即可:
這裡寫圖片描述

下面是一部分程式碼的執行效果,我目前是模擬使用者只有admin許可權,沒有從資料庫查詢,不過和從資料庫中查詢沒什麼區別。
這裡寫圖片描述
如上圖,queryAll方法需要user許可權才能訪問,queryByIdAndId方法需要admin許可權才能訪問。
返回如下結果:
這裡寫圖片描述
這裡寫圖片描述

如程式碼或邏輯有不足之處,麻煩請指點,非常感謝!