註解實現介面攔截功能

2021-10-13 09:53:33 字數 4750 閱讀 9418

方式一

我們在spring boot專案中時候,一般會採用token作為身份驗證,這樣也方便前端做免登入功能

一般方式:我們會自定義乙個***,繼承webmvcconfigurer類,重寫addinterceptors方法,效果如下:

@configuration

public

class

interceptorconfig

implements

webmvcconfigurer

; registry.

addinterceptor

(clientuserapiinterceptor)

.addpathpatterns

("/api/v*/client/**").

excludepathpatterns

(clientuserapiarrays);}

}

將不用token驗證的介面位址過濾掉,這樣也是很不錯的做法

github位址

第二種方式

採用註解的方式

先看下在**中的應用,看看是不是你要的效果,不需要驗證預設是不用加的

@apioperation

(value =

"獲取推薦商戶列表"

, notes =

"獲取推薦商戶列表")(

"/getmerchantlist"

)@usertoken

public baseresult

>

getmerchantlist()

先定義兩個註解用來區分需要token驗證和不需要token驗證

passtoken註解(對方法使用)

@target()

@retention

(retentionpolicy.runtime)

public @inte***ce

passtoken

usertoken註解(對方法使用)

@target()

@retention

(retentionpolicy.runtime)

public @inte***ce

usertoken

我們對剛才繼承webmvcconfigurer類改造一下

@configuration

public

class

userapiinterceptorconfig

implements

webmvcconfigurer

// userapiinterceptor***

@bean

public userapiinterceptor authenticationinterceptor()

@override

public

void

addargumentresolvers

(list

resolvers)

}

userapiinterceptor類(用於攔截區分帶usertoken的註解或者passtoken的註解)

@slf4j

@component

public

class

userapiinterceptor

implements

handlerinterceptor

], 請求引數[{}]"

, request.

getrequesturi()

, jsonobject.

tojson

(request.

getparametermap()

)); string token = request.

getheader

(jwttokenutil.header_string)

;// 如果不是對映到方法直接通過if(

!(object instanceof

handlermethod))

handlermethod handlermethod =

(handlermethod) object;

method method = handlermethod.

getmethod()

;// 檢查是否有passtoken注釋,有則跳過認證

if(method.

isannotationpresent

(passtoken.

class))

}// 檢查有沒有需要使用者許可權的註解

if(method.

isannotationpresent

(usertoken.

class))

boolean valid = jwttokenutil.

validatejwttoken

(token);if

(!valid)

user user = iuserservice.

getbyid

(jwttokenutil.

getjwtuserid

(request));

if(user == null)

userinfovo userinfovo =

newuserinfovo()

; beanutils.

copyproperties

(user, userinfovo)

;//我們將解析的使用者結果先放入session中

request.

getsession()

.setattribute

("currentuser"

,userinfovo);}

}return

true;}

}

currentuserhandlermethodargresolver類(用於獲取currentuser註解物件的值,後面會介紹)

@slf4j

@component

public

class

currentuserhandlermethodargresolver

implements

handlermethodargumentresolver

/** * 注入引數值

*/@override

public object resolveargument

(methodparameter methodparameter, modelandviewcontainer modelandviewcontainer, nativewebrequest nativewebrequest, webdatabinde***ctory webdatabinde***ctory)

throws exception "

, userinfovo.

getid()

);return userinfovo;

}}

這時候便可以使用這個上面passtoken和usertoken註解了(有些**工具缺失,最後有原始碼包可供參考)

@apioperation

(value =

"獲取推薦商戶列表"

, notes =

"獲取推薦商戶列表")(

"/getmerchantlist"

)@usertoken

public baseresult

>

getmerchantlist()

我們來看下currentuser的註解的用途

專案中我們一般通過token驗證來驗證某個使用者是否是登入狀態,我們只驗證登入狀態,不去獲取這個使用者的資訊嗎,一般情況下,我們也可以通過request這種方式,將token(id)傳入每個方法中,然後用該token獲取獲取id,在通過id獲取一些資訊,這樣也是可以的,這邊我們tokencurrentuser註解,直接將使用者資訊拿到,供後面開發使用,即加即用,先看效果:

@apioperation

(value =

"獲取輪播圖列表"

, notes =

"獲取輪播圖列表介面")(

"/getbannerlist"

)@usertoken

public baseresult

>

getbannerlist

(@currentuser userinfovo userinfovo)

列印結果:

2020-12

-2916:

41:13.788 info 12632---

[nio-

8081

-exec-

3] com.llayjun.millet.api.bannercontroller : userinfovouserinfovo

currentuser註解類(對物件使用)

@target() // annotation所修飾的物件範圍:方法引數

@documented

public @inte***ce currentuser

源**

github位址

vue vue router實現路由攔截功能

路由配置如下,在這裡自定義了乙個物件的引數meta 來標記哪些路由是需要登入驗證的,導航被觸發的時候只要判斷是否目標路由中是否有meta這個物件,且meta包含authrequired屬性,其值為true。這裡訪問帶有meta物件的路由是被攔截的。component config component...

註解實現EventBus功能

核心還是反射,註解相關的好像都需要通過反射去處理 實現思路 1.定義乙個map集合存放註冊eventbus的物件,以及該物件註冊的事件方法和引數 2.註冊時去遍歷獲取該物件符合條件的註解屬性,並存到步驟1的集合中 3.傳送事件時,遍歷步驟1建立的集合,判斷傳送事件的object物件型別,如果集合中有...

基於springBoot實現請求攔截功能

1 定義乙個過濾器的類authenticationfilter 繼承handlerinterceptoradapter 類 2 右鍵generate 重寫父類的方法prehandle 如果返回false則不能訪問,返回true則可以訪問 3 定義令牌的請求頭 請求帶上令牌,authorization...