方式一
我們在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...