springboot如何完美通過token獲取用戶信息
1. 什么是Token?

身份驗證令牌(Authentication Token):在身份驗證過程中,“token”
可以表示一個包含用戶身份信息的令牌。
例如
Token(JWT)是一種常見的身份驗證令牌,它包含用戶的身份信息(例如用戶名或用戶ID)以及其他相關(guān)信息,如權(quán)限或過期時間。無意義令牌token,這種一般在獲取后通過nosql查詢token對應(yīng)的用戶信息。
當(dāng)然,設(shè)計token網(wǎng)上大多有現(xiàn)成的解決方案,但是通過token如何拿個人信息呢?
2. 如何優(yōu)雅的獲取用戶信息?
雖然token是用戶憑證,但是在后端中,token是不能直接和數(shù)據(jù)進(jìn)行交互的,我們需要轉(zhuǎn)換成token用戶信息。
解決思路:
我們大多會在過濾器filter進(jìn)行token檢驗,在這里我們已經(jīng)已經(jīng)從header中解析并且驗證了token了。如果我們要是再在Controller中獲取header,在解決,感覺一點也不優(yōu)雅。

我們的兩種解決方案:
通過header進(jìn)行解析(推薦):
哈哈哈,沒想到我們還是從這種low的方法里弄的吧。 實際上nosql性能很不錯,再查一次也無傷大雅,并且這種方式耦合度較低,符合代碼規(guī)范。
我們可以通過注解的方式,可以盡量美觀很多
1.1. 創(chuàng)建CurrentUserUuid接口
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUserUuid {
}
1.2. 創(chuàng)建oginUserHandlerMethodArgumentResolver解析器

@Component
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Resource
private TokenUtil tokenUtil;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(CurrentUserUuid.class) &&
parameter.getParameterType().isAssignableFrom(String.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
NativeWebRequest request, WebDataBinderFactory factory) {
// header中獲取用戶token
String token = request.getHeader("Authorization");
// TODO 根據(jù)userId獲取User信息,這里省略,直接創(chuàng)建一個User對象。
return tokenUtil.getUserToken(token);
}
}
過濾器二次封裝請求體
我們可以在第一次過濾器查的時候,把對應(yīng)的信息封裝到請求中,但是請求多變,get,post參數(shù)一般在不同的位置上,需要寫更復(fù)雜的結(jié)構(gòu)
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String token = request.getHeader("token");
JWTResult result = JWTUtils.checkToken(token);
Long userId = result.getUserId();
HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {
@Override
public String[] getParameterValues(String name) {
if (name.equals("loginUserId")) {
return new String[] { userId .toString() };
}
return super.getParameterValues(name);
}
@Override
public Enumeration<String> getParameterNames() {
Set<String> paramNames = new LinkedHashSet<>();
paramNames.add("loginUserId");
Enumeration<String> names = super.getParameterNames();
while(names.hasMoreElements()) {
paramNames.add(names.nextElement());
}
return Collections.enumeration(paramNames);
}
};
chain.doFilter(requestWrapper, httpResponse);
}
這種好處是只需要查一次,但是請求參數(shù)多變,需要寫很多額外的解構(gòu)去處理,并且增加了耦合度
3. 總結(jié)
我還是推薦方法1,無疑,雖然多查一次,但是結(jié)構(gòu)簡單,耦合度低,并且代碼較為簡潔。
到此這篇關(guān)于springboot如何完美通過token獲取用戶信息的文章就介紹到這了,更多相關(guān)springboot token獲取用戶信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中獲取微信用戶信息的方法
- SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實現(xiàn)解析
- Springboot+Shiro記錄用戶登錄信息并獲取當(dāng)前登錄用戶信息的實現(xiàn)代碼
- SpringBoot使用Redis的zset統(tǒng)計在線用戶信息
- Springboot通過請求頭獲取當(dāng)前用戶信息方法詳細(xì)示范
- SpringBoot登錄、退出、獲取用戶信息的session處理方案
- springboot登錄攔截器+ThreadLocal實現(xiàn)用戶信息存儲的實例代碼
- SpringBoot通過參數(shù)注解自動獲取當(dāng)前用戶信息的方法
- SpringBoot中的ThreadLocal保存請求用戶信息的實例demo
- springboot獲取當(dāng)前用戶信息的三種方式
相關(guān)文章
Delphi實現(xiàn)檢測并枚舉系統(tǒng)安裝的打印機的方法
這篇文章主要介紹了Delphi實現(xiàn)檢測并枚舉系統(tǒng)安裝的打印機的方法,需要的朋友可以參考下2014-07-07
解決delphi TAdoQuery組件的close方法導(dǎo)致”列名無效“錯誤的問題
今天小編就為大家分享一篇解決delphi TAdoQuery組件的close方法導(dǎo)致”列名無效“錯誤的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法
這篇文章主要介紹了Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法,需要的朋友可以參考下2014-08-08
在Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像的圖文演示無錯
最近打算學(xué)習(xí)Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像,網(wǎng)上的好多Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像都是錯誤的,所以我把圖片給弄好了。2008-01-01
Delphi 根據(jù)字符串找到函數(shù)并執(zhí)行的實例
這篇文章主要介紹了Delphi 根據(jù)字符串找到函數(shù)并執(zhí)行的實例的相關(guān)資料,希望通過本能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
Delphi實現(xiàn)獲取句柄并發(fā)送消息的方法
這篇文章主要介紹了Delphi實現(xiàn)獲取句柄并發(fā)送消息的方法,需要的朋友可以參考下2014-07-07

