Java?自定義注解在登錄驗(yàn)證的應(yīng)用示例
java注解
從 JDK 5開始,Java 增加了注解的新功能,注解其實(shí)是代碼里面的特殊標(biāo)記,這些標(biāo)記可以在編譯、類加載和運(yùn)行時(shí)被讀取,在不改變代碼原有邏輯下,給源文件嵌入注解信息。再通過返回獲取注解信息,根據(jù)不同的注解信息處理不同邏輯。其中 Java 有以下幾個(gè)元Annotation:
@Retention
@Retention修飾 Annotation 可以保留多長時(shí)間,只包含一個(gè) RetentionPolicy 一個(gè)成員變量。
- RetentionPolicy.CLASS 默認(rèn)值,編譯器把 Annotation 記錄在 class 文件中。當(dāng)運(yùn)行 Java 程序時(shí),JVM 不能獲取 Annotation 信息。
- RetentionPolicy.RUNTIME 編譯器把 Annotation 記錄在 class 文件中,當(dāng)運(yùn)行 Java 程序時(shí),JVM 可以獲取 Annotation 信息,可以通過反射獲取 Annotation 信息,自定義注解使用此變量比較多。
- RetentionPolicy.SOURCE Annotation 只保留在源代碼(也就是 Java 文件),編譯器直接拋棄 Annotation。
@Target
@Target 修飾一個(gè) Annotation 定義,它表示 Annotation 可以修飾在哪些地方:
- ElementType.TYPE 類、接口以及枚舉
- ElementType.FIELD 成員變量
- ElementType.METHOD 方法
- ElementType.PARAMETER 包定義
- ElementType.CONSTRUCTOR 構(gòu)造器
- ElementType.ANNOTATION_TYPE Annotation
- ElementType.PARAMETER 參數(shù)
登錄注解 @Logined
注解需求
以電商系統(tǒng)舉例,請求后端接口分成兩類:需要登錄后才能訪問和不需要登錄訪問,所以就需要根據(jù)不同的需求做不同的處理,不需要登錄的訪問的接口不用做處理,而需要登錄的接口需要在每次請求時(shí)驗(yàn)證請求,而在 Spring 可以使用攔截器作一個(gè)登錄信息驗(yàn)證,而是否需要登錄驗(yàn)證,這就需要用到注解了。
首先創(chuàng)建一個(gè)注解 @Logined,它要實(shí)現(xiàn)的功能:在需要登錄才能訪問的接口上添加該注解,可以添加在類和方法上,如果添加在類上,類下面所以的請求方法都需要進(jìn)行登錄驗(yàn)證。添加到方法上,只針對該方法需要驗(yàn)證。@Logined 注解定義如下:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Logined { /** * 是否需要已經(jīng)登錄才允許訪問 * * @return */ boolean isLogined() default true; }
其中 @Target 設(shè)置 ElementType.METHOD 和 ElementType.TYPE 表示注解可以修飾在類和方法上,@Retention 設(shè)置 RetentionPolicy.RUNTIME 需要在運(yùn)行時(shí),JVM 可以獲取到注解信息。isLogined 是注解的一個(gè)成員變量,這個(gè)在后面會講到。
首先定義一個(gè) Controller 控制器:
@RestController @Logined public class TestController { @GetMapping("/login") public String login() { return "need login"; } }
在攔截器上獲取 @Logined 注解
每次發(fā)送一個(gè) http 請求后,都會進(jìn)入到攔截器中。
public class MyInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); boolean isLogin = this.isLogin(method); if (!isLogin){ return true; } // 這里對登錄信息驗(yàn)證,比如token驗(yàn)證,cookie驗(yàn)證 return true; } private boolean isLogin(Method method) { //獲取方法頭部值 Logined classLogined = method.getDeclaringClass().getAnnotation(Logined.class); Logined methodLogined = method.getAnnotation(Logined.class); // 如果方法上有注解返回 isLogined if (classLogined != null && methodLogined == null) { System.out.println(classLogined.isLogined()); return classLogined.isLogined(); } // 方法沒有注解,再找類上注解 if ((classLogined != null && methodLogined != null) || (classLogined == null && methodLogined != null)) { return methodLogined.isLogined(); } return false; } }
攔截器流程:
- 獲取請求類對應(yīng)的方法
- 通過反射找到方法上的 @Logined 注解,和類上的 @Logined 注解
- 如果類上有 @Logined 注解,方法上沒有 @Logined 注解,返回類 @Logined 注解的 isLogined
- 如果類和方法都有 @Logined 注解或者類沒有 @Logined 方法有注解,返回方法的 isLogined
經(jīng)過上述判斷,如果返回是false,就不進(jìn)行后續(xù)登錄信息驗(yàn)證,否則需要登錄信息驗(yàn)證。登錄信息驗(yàn)證可以 token 驗(yàn)證、cookie驗(yàn)證。
總結(jié)
- 在需要請求的接口類或者方法上添加 @Logined,表明需要改請求接口需要登錄后才能訪問。如果不需要就不添加,如果類添加了,而某個(gè)方法不需要登錄才能訪問,添加 @Logined(isLogined = false) 即可。
- 在攔截器里面獲取類或者方法的注解,如果有注解,則需要登錄驗(yàn)證,如果沒有,就直接通過。
到此這篇關(guān)于Java 自定義注解在登錄驗(yàn)證的應(yīng)用示例的文章就介紹到這了,更多相關(guān)Java注解登錄驗(yàn)證 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 5分鐘教你使用java搞定網(wǎng)站登錄驗(yàn)證碼
- Java實(shí)現(xiàn)注冊登錄與郵箱發(fā)送賬號驗(yàn)證激活功能
- Java登錄功能實(shí)現(xiàn)token生成與驗(yàn)證
- 教你用Java驗(yàn)證服務(wù)器登錄系統(tǒng)
- Java Web制作登錄驗(yàn)證碼實(shí)現(xiàn)代碼解析
- JavaWeb簡單用戶登錄注冊實(shí)例代碼(有驗(yàn)證碼)
- Java Web實(shí)現(xiàn)登錄頁面驗(yàn)證碼驗(yàn)證功能
- java圖片滑動驗(yàn)證(登錄驗(yàn)證)原理與實(shí)現(xiàn)方法詳解
- java實(shí)現(xiàn)登錄驗(yàn)證碼
- Java基于Session登錄驗(yàn)證的實(shí)現(xiàn)示例
相關(guān)文章
Spring @CrossOrigin 注解原理實(shí)現(xiàn)
這篇文章主要介紹了Spring @CrossOrigin 注解原理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java中Spring使用Quartz任務(wù)調(diào)度定時(shí)器
本篇文章主要介紹了Java中Spring使用Quartz任務(wù)調(diào)度定時(shí)器,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-02-02java實(shí)現(xiàn)騰訊ocr圖片識別接口調(diào)用
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)騰訊ocr圖片識別接口調(diào)用,拍車牌識別車牌號功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Java編寫程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算
這篇文章主要介紹了Java編寫程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算,本文通過實(shí)例代碼給大家介紹的非常想詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02