日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

前后端分离项目,后端是如何处理前端传递的token?

發(fā)布時間:2023/12/10 HTML 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前后端分离项目,后端是如何处理前端传递的token? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前后端分離項目中,在不使用 SpringSecurityShiro 安全框架的情況下,后端是如何處理前段傳遞的 token 的呢?

簡單說一個場景,在一個非常小的項目中,由于業(yè)務(wù)邏輯比較簡單,也沒有啥安全要求,所以決定不采用 SpringSecurityShiro 等安全框架,但由于大部分方法都會用到當(dāng)前的用戶信息,所以決定對前端傳遞的用戶token進(jìn)行一次公共處理。

解決思路:采用自定義注解方式,將token對應(yīng)的數(shù)據(jù)自動注入到相應(yīng)實體中。

最終實現(xiàn)效果如下,帶有 @CurrentUser 注解的 UserModel 實體會自動注入用戶信息。

@RequestMapping(value?=?"getUserInfo",?method?=?{RequestMethod.POST})
@ApiOperation(value?=?"我是某方法")
public?Result<UserModel>?getUserInfo(@CurrentUser?UserModel?user){
????return?ResultUtil.success(user);
}

1、自定義解析器

實現(xiàn)自定義解析器需要實現(xiàn) HandlerMethodArgumentResolver 接口,該接口包含兩個方法:supportsParameter + resolveArgument

簡單說一下這兩個方法的作用:

  • supportsParameter:用于判定參數(shù)是否需要進(jìn)行分解處理,說白了就是一個過濾方法,如果返回true則表示需要,并會去調(diào)用 resolveArgument() 方法。

  • resolveArgument:真正處理參數(shù)分解的方法,返回的Object對象為Controller中的參數(shù)類型對象,本文中為 UserModel

正式開始,我們創(chuàng)建一個 class ,取名為 CurrentUserMethodArgumentResolver,實現(xiàn)上邊提到的這兩個方法:

@Component
public?class?CurrentUserMethodArgumentResolver?implements?HandlerMethodArgumentResolver?{

????@Autowired
????private?UserDao?userDao;

????@Override
????public?boolean?supportsParameter(MethodParameter?parameter)?{
????????/**如果參數(shù)類型是User并且有CurrentUser注解則支持**/
????????if?(parameter.getParameterType().isAssignableFrom(UserModel.class)?&&
????????????????parameter.hasParameterAnnotation(CurrentUser.class))?{
????????????return?true;
????????}
????????return?false;
????}

????@Override
????public?Object?resolveArgument(MethodParameter?parameter,?ModelAndViewContainer?mavContainer,?NativeWebRequest?webRequest,?WebDataBinderFactory?binderFactory)?throws?Exception?{

????????/**取出前端Header或者是參數(shù)中攜帶的token,如下二選一**/
????????String?token?=?webRequest.getHeader("token");
????????String?token?=?webRequest.getParameter("token");

????????if?(token?!=?null)?{
????????????/**對token進(jìn)行解析,比如從redis中取出token所對應(yīng)的用戶標(biāo)識**/
????????????/**總之就是從token中得到用戶的唯一標(biāo)識,然后從數(shù)據(jù)庫中查詢并返回**/
????????????User?user?=?userDao.findByUserId(用戶唯一標(biāo)識userId);
????????????UserModel?result?=?new?UserModel();
????????????BeanUtils.copyProperties(user,?result);
????????????return?result;
????????}
????????return?null;
????}
}????

2、簡單說一下上方方法

supportsParameter:通過 UserModel 類型判斷 + CurrentUser 注解判斷,驗證是否返回 true

resolveArgument:主要通過 webRequest 獲取 Header 或者是 Parmeter 中的 token 參數(shù),取到參數(shù)后首先對 token 進(jìn)行處理,換取用戶的唯一標(biāo)識,拿到用戶唯一標(biāo)識后再去數(shù)據(jù)庫查詢相應(yīng)的用戶信息,然后進(jìn)行一個格式轉(zhuǎn)換,畢竟有些數(shù)據(jù)還是不要直接返回給前臺的好「用戶密碼等」。

至于怎么使用,最開始已經(jīng)貼過代碼了,只要在 UserModel 加入 @CurrentUser 注解即可實現(xiàn)數(shù)據(jù)注入了,當(dāng)然,前端勢必要加入 token 參數(shù)才可以:

@RequestMapping(value?=?"getUserInfo",?method?=?{RequestMethod.POST})
@ApiOperation(value?=?"我是某方法")
public?Result<UserModel>?getUserInfo(@CurrentUser?UserModel?user){
????return?ResultUtil.success(user);
}

最后

博客地址:https://www.cgblog.com/niceyoo

如果覺得這篇文章有丶東西,不放關(guān)注一下我,關(guān)注是對我最大的鼓勵~

18年專科畢業(yè)后,期間一度迷茫,最近我創(chuàng)建了一個公眾號用來記錄自己的成長。

總結(jié)

以上是生活随笔為你收集整理的前后端分离项目,后端是如何处理前端传递的token?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。