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