天天看點

Java 自定義注解在登入驗證的應用

從 JDK 5開始,Java 增加了注解的新功能,注解其實是代碼裡面的特殊标記,這些标記可以在編譯、類加載和運作時被讀取,在不改變代碼原有邏輯下,給源檔案嵌入注解資訊。再通過傳回擷取注解資訊,根據不同的注解資訊處理不同邏輯。其中 Java 有以下幾個元Annotation:

@Retention修飾 Annotation 可以保留多長時間,隻包含一個 RetentionPolicy 一個成員變量。

RetentionPolicy.CLASS 預設值,編譯器把 Annotation 記錄在 class 檔案中。當運作 Java 程式時,JVM 不能擷取 Annotation 資訊。

RetentionPolicy.RUNTIME 編譯器把 Annotation 記錄在 class 檔案中,當運作 Java 程式時,JVM 可以擷取 Annotation 資訊,可以通過反射擷取 Annotation 資訊,自定義注解使用此變量比較多。

RetentionPolicy.SOURCE Annotation 隻保留在源代碼(也就是 Java 檔案),編譯器直接抛棄 Annotation。

@Target 修飾一個 Annotation 定義,它表示 Annotation 可以修飾在哪些地方:

ElementType.TYPE 類、接口以及枚舉

ElementType.FIELD 成員變量

ElementType.METHOD 方法

ElementType.PARAMETER 包定義

ElementType.CONSTRUCTOR 構造器

ElementType.ANNOTATION_TYPE Annotation

ElementType.PARAMETER 參數

以電商系統舉例,請求後端接口分成兩類:需要登入後才能通路和不需要登入通路,是以就需要根據不同的需求做不同的處理,不需要登入的通路的接口不用做處理,而需要登入的接口需要在每次請求時驗證請求,而在 Spring 可以使用攔截器作一個登入資訊驗證,而是否需要登入驗證,這就需要用到注解了。

首先建立一個注解 @Logined,它要實作的功能:在需要登入才能通路的接口上添加該注解,可以添加在類和方法上,如果添加在類上,類下面是以的請求方法都需要進行登入驗證。添加到方法上,隻針對該方法需要驗證。@Logined 注解定義如下:

其中 @Target 設定 ElementType.METHOD 和 ElementType.TYPE 表示注解可以修飾在類和方法上,@Retention 設定 RetentionPolicy.RUNTIME 需要在運作時,JVM 可以擷取到注解資訊。isLogined 是注解的一個成員變量,這個在後面會講到。

首先定義一個 Controller 控制器:

每次發送一個 http 請求後,都會進入到攔截器中。

擷取請求類對應的方法

通過反射找到方法上的 @Logined 注解,和類上的 @Logined 注解

如果類上有 @Logined 注解,方法上沒有 @Logined 注解,傳回類 @Logined 注解的 isLogined

如果類和方法都有 @Logined 注解或者類沒有 @Logined 方法有注解,傳回方法的 isLogined

經過上述判斷,如果傳回是false,就不進行後續登入資訊驗證,否則需要登入資訊驗證。登入資訊驗證可以 token 驗證、cookie驗證。

在需要請求的接口類或者方法上添加 @Logined,表明需要改請求接口需要登入後才能通路。如果不需要就不添加,如果類添加了,而某個方法不需要登入才能通路,添加 @Logined(isLogined = false) 即可。

在攔截器裡面擷取類或者方法的注解,如果有注解,則需要登入驗證,如果沒有,就直接通過。

如果覺得文章對你有幫助的話,請點個推薦吧!