您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java自定義注解在登錄驗證的應(yīng)用方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java自定義注解在登錄驗證的應(yīng)用方法是什么”吧!
從 JDK 5開始,Java 增加了注解的新功能,注解其實是代碼里面的特殊標(biāo)記,這些標(biāo)記可以在編譯、類加載和運行時被讀取,在不改變代碼原有邏輯下,給源文件嵌入注解信息。再通過返回獲取注解信息,根據(jù)不同的注解信息處理不同邏輯。其中 Java 有以下幾個元Annotation:
@Retention修飾 Annotation 可以保留多長時間,只包含一個 RetentionPolicy 一個成員變量。
RetentionPolicy.CLASS 默認(rèn)值,編譯器把 Annotation 記錄在 class 文件中。當(dāng)運行 Java 程序時,JVM 不能獲取 Annotation 信息。
RetentionPolicy.RUNTIME 編譯器把 Annotation 記錄在 class 文件中,當(dāng)運行 Java 程序時,JVM 可以獲取 Annotation 信息,可以通過反射獲取 Annotation 信息,自定義注解使用此變量比較多。
RetentionPolicy.SOURCE Annotation 只保留在源代碼(也就是 Java 文件),編譯器直接拋棄 Annotation。
@Target 修飾一個 Annotation 定義,它表示 Annotation 可以修飾在哪些地方:
ElementType.TYPE 類、接口以及枚舉
ElementType.FIELD 成員變量
ElementType.METHOD 方法
ElementType.PARAMETER 包定義
ElementType.CONSTRUCTOR 構(gòu)造器
ElementType.ANNOTATION_TYPE Annotation
ElementType.PARAMETER 參數(shù)
以電商系統(tǒng)舉例,請求后端接口分成兩類:需要登錄后才能訪問和不需要登錄訪問,所以就需要根據(jù)不同的需求做不同的處理,不需要登錄的訪問的接口不用做處理,而需要登錄的接口需要在每次請求時驗證請求,而在 Spring 可以使用攔截器作一個登錄信息驗證,而是否需要登錄驗證,這就需要用到注解了。
首先創(chuàng)建一個注解 @Logined,它要實現(xiàn)的功能:在需要登錄才能訪問的接口上添加該注解,可以添加在類和方法上,如果添加在類上,類下面所以的請求方法都需要進(jì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 需要在運行時,JVM 可以獲取到注解信息。isLogined 是注解的一個成員變量,這個在后面會講到。
首先定義一個 Controller 控制器:
@RestController @Logined public class TestController { @GetMapping("/login") public String login() { return "need login"; } }
每次發(fā)送一個 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; } // 這里對登錄信息驗證,比如token驗證,cookie驗證 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ù)登錄信息驗證,否則需要登錄信息驗證。登錄信息驗證可以 token 驗證、cookie驗證。
感謝各位的閱讀,以上就是“Java自定義注解在登錄驗證的應(yīng)用方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java自定義注解在登錄驗證的應(yīng)用方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。