springboot如何完美通過(guò)token獲取用戶信息
1. 什么是Token?
身份驗(yàn)證令牌(Authentication Token):在身份驗(yàn)證過(guò)程中,“token”
可以表示一個(gè)包含用戶身份信息的令牌。
例如
Token(JWT)
是一種常見(jiàn)的身份驗(yàn)證令牌,它包含用戶的身份信息(例如用戶名或用戶ID)以及其他相關(guān)信息,如權(quán)限或過(guò)期時(shí)間。無(wú)意義令牌token,這種一般在獲取后通過(guò)nosql
查詢token對(duì)應(yīng)的用戶信息。
當(dāng)然,設(shè)計(jì)token網(wǎng)上大多有現(xiàn)成的解決方案,但是通過(guò)token如何拿個(gè)人信息呢?
2. 如何優(yōu)雅的獲取用戶信息?
雖然token是用戶憑證,但是在后端中,token是不能直接和數(shù)據(jù)進(jìn)行交互的,我們需要轉(zhuǎn)換成token用戶信息。
解決思路:
我們大多會(huì)在過(guò)濾器filter進(jìn)行token檢驗(yàn),在這里我們已經(jīng)已經(jīng)從header中解析并且驗(yàn)證了token了。如果我們要是再在Controller中獲取header,在解決,感覺(jué)一點(diǎn)也不優(yōu)雅。
我們的兩種解決方案:
通過(guò)header進(jìn)行解析(推薦):
哈哈哈,沒(méi)想到我們還是從這種low的方法里弄的吧。 實(shí)際上nosql性能很不錯(cuò),再查一次也無(wú)傷大雅,并且這種方式耦合度較低,符合代碼規(guī)范。
我們可以通過(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)建一個(gè)User對(duì)象。 return tokenUtil.getUserToken(token); } }
過(guò)濾器二次封裝請(qǐng)求體
我們可以在第一次過(guò)濾器查的時(shí)候,把對(duì)應(yīng)的信息封裝到請(qǐng)求中,但是請(qǐng)求多變,get,post參數(shù)一般在不同的位置上,需要寫(xiě)更復(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); }
這種好處是只需要查一次,但是請(qǐng)求參數(shù)多變,需要寫(xiě)很多額外的解構(gòu)去處理,并且增加了耦合度
3. 總結(jié)
我還是推薦方法1,無(wú)疑,雖然多查一次,但是結(jié)構(gòu)簡(jiǎn)單,耦合度低,并且代碼較為簡(jiǎn)潔。
到此這篇關(guān)于springboot如何完美通過(guò)token獲取用戶信息的文章就介紹到這了,更多相關(guān)springboot token獲取用戶信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中獲取微信用戶信息的方法
- SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實(shí)現(xiàn)解析
- Springboot+Shiro記錄用戶登錄信息并獲取當(dāng)前登錄用戶信息的實(shí)現(xiàn)代碼
- SpringBoot使用Redis的zset統(tǒng)計(jì)在線用戶信息
- Springboot通過(guò)請(qǐng)求頭獲取當(dāng)前用戶信息方法詳細(xì)示范
- SpringBoot登錄、退出、獲取用戶信息的session處理方案
- springboot登錄攔截器+ThreadLocal實(shí)現(xiàn)用戶信息存儲(chǔ)的實(shí)例代碼
- SpringBoot通過(guò)參數(shù)注解自動(dòng)獲取當(dāng)前用戶信息的方法
- SpringBoot中的ThreadLocal保存請(qǐng)求用戶信息的實(shí)例demo
- springboot獲取當(dāng)前用戶信息的三種方式
相關(guān)文章
Delphi實(shí)現(xiàn)檢測(cè)并枚舉系統(tǒng)安裝的打印機(jī)的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)檢測(cè)并枚舉系統(tǒng)安裝的打印機(jī)的方法,需要的朋友可以參考下2014-07-07解決delphi TAdoQuery組件的close方法導(dǎo)致”列名無(wú)效“錯(cuò)誤的問(wèn)題
今天小編就為大家分享一篇解決delphi TAdoQuery組件的close方法導(dǎo)致”列名無(wú)效“錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法
這篇文章主要介紹了Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法,需要的朋友可以參考下2014-08-08Delphi 實(shí)現(xiàn)軟件自動(dòng)升級(jí)的功能
這篇文章主要介紹了Delphi 實(shí)現(xiàn)軟件自動(dòng)升級(jí)的功能的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09在Delphi實(shí)現(xiàn)在數(shù)據(jù)庫(kù)中存取圖像的圖文演示無(wú)錯(cuò)
最近打算學(xué)習(xí)Delphi實(shí)現(xiàn)在數(shù)據(jù)庫(kù)中存取圖像,網(wǎng)上的好多Delphi實(shí)現(xiàn)在數(shù)據(jù)庫(kù)中存取圖像都是錯(cuò)誤的,所以我把圖片給弄好了。2008-01-01Delphi 根據(jù)字符串找到函數(shù)并執(zhí)行的實(shí)例
這篇文章主要介紹了Delphi 根據(jù)字符串找到函數(shù)并執(zhí)行的實(shí)例的相關(guān)資料,希望通過(guò)本能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09Delphi實(shí)現(xiàn)獲取句柄并發(fā)送消息的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)獲取句柄并發(fā)送消息的方法,需要的朋友可以參考下2014-07-07Delphi實(shí)現(xiàn)窗口文字淡入淡出漸變效果的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)窗口文字淡入淡出漸變效果,需要的朋友可以參考下2014-07-07