最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?自定義注解在登錄驗證的應(yīng)用示例

 更新時間:2021年12月20日 11:41:08   作者:小碼code  
本文主要介紹了Java?自定義注解在登錄驗證的應(yīng)用示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

java注解

從 JDK 5開始,Java 增加了注解的新功能,注解其實是代碼里面的特殊標(biāo)記,這些標(biāo)記可以在編譯、類加載和運行時被讀取,在不改變代碼原有邏輯下,給源文件嵌入注解信息。再通過返回獲取注解信息,根據(jù)不同的注解信息處理不同邏輯。其中 Java 有以下幾個元Annotation:

@Retention

@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

@Target 修飾一個 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ù)不同的需求做不同的處理,不需要登錄的訪問的接口不用做處理,而需要登錄的接口需要在每次請求時驗證請求,而在 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";
 }
}

在攔截器上獲取 @Logined 注解

每次發(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驗證。

總結(jié)

  • 在需要請求的接口類或者方法上添加 @Logined,表明需要改請求接口需要登錄后才能訪問。如果不需要就不添加,如果類添加了,而某個方法不需要登錄才能訪問,添加 @Logined(isLogined = false) 即可。
  • 在攔截器里面獲取類或者方法的注解,如果有注解,則需要登錄驗證,如果沒有,就直接通過。

到此這篇關(guān)于Java 自定義注解在登錄驗證的應(yīng)用示例的文章就介紹到這了,更多相關(guān)Java注解登錄驗證 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring 實現(xiàn)excel及pdf導(dǎo)出表格示例

    Spring 實現(xiàn)excel及pdf導(dǎo)出表格示例

    本篇文章主要介紹了Spring 實現(xiàn)excel及pdf導(dǎo)出表格示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • MyBatis常用標(biāo)簽大全

    MyBatis常用標(biāo)簽大全

    這篇文章主要介紹了MyBatis常用標(biāo)簽大全的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • springboot如何配置嵌套map和list參數(shù)

    springboot如何配置嵌套map和list參數(shù)

    這篇文章主要介紹了springboot如何配置嵌套map和list參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java中的異步加載new Thread()方式

    java中的異步加載new Thread()方式

    這篇文章主要介紹了java中的異步加載new Thread()方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • spring boot整合log4j2及MQ消費處理系統(tǒng)日志示例

    spring boot整合log4j2及MQ消費處理系統(tǒng)日志示例

    這篇文章主要為大家介紹了spring boot整合log4j2及MQ消費處理系統(tǒng)日志的示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • java中g(shù)radle項目報錯org.gradle?.api.plugins.MavenPlugin解決辦法

    java中g(shù)radle項目報錯org.gradle?.api.plugins.MavenPlugin解決辦法

    在使用Gradle時開發(fā)者可能會遇到org.gradle?.api.plugins.MavenPlugin報錯提醒,這篇文章主要給大家介紹了關(guān)于java中g(shù)radle項目報錯org.gradle?.api.plugins.MavenPlugin的解決辦法,需要的朋友可以參考下
    2023-12-12
  • SpringBoot下使用自定義監(jiān)聽事件的流程分析

    SpringBoot下使用自定義監(jiān)聽事件的流程分析

    事件機制是Spring的一個功能,目前我們使用了SpringBoot框架,所以記錄下事件機制在SpringBoot框架下的使用,同時實現(xiàn)異步處理,這篇文章主要介紹了SpringBoot下使用自定義監(jiān)聽事件,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于idea中Java Web項目的訪問路徑問題

    關(guān)于idea中Java Web項目的訪問路徑問題

    這篇文章主要介紹了idea中Java Web項目的訪問路徑問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java實現(xiàn)多線程下載和斷點續(xù)傳

    Java實現(xiàn)多線程下載和斷點續(xù)傳

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)多線程下載和斷點續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • MyBatisPlus標(biāo)準(zhǔn)數(shù)據(jù)層CRUD的使用詳解

    MyBatisPlus標(biāo)準(zhǔn)數(shù)據(jù)層CRUD的使用詳解

    這篇文章主要介紹了MyBatisPlus標(biāo)準(zhǔn)數(shù)據(jù)層CRUD的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論

察哈| 承德市| 蓬莱市| 莎车县| 葵青区| 中宁县| 博兴县| 东港市| 偏关县| 武义县| 清涧县| 海淀区| 柳州市| 恭城| 顺义区| 法库县| 抚顺市| 清镇市| 元阳县| 婺源县| 五华县| 雅江县| 西盟| 乐陵市| 平乡县| 梨树县| 曲阳县| 蓝田县| 柞水县| 观塘区| 德庆县| 南昌市| 灵石县| 区。| 葫芦岛市| 青冈县| 云浮市| 交口县| 正阳县| 乡宁县| 浦城县|