java實(shí)現(xiàn)二維碼掃碼授權(quán)登陸
假設(shè)現(xiàn)在有2個(gè)設(shè)備,A設(shè)備需要掃碼授權(quán)登陸,B設(shè)備是已經(jīng)登陸了的設(shè)備。然后實(shí)現(xiàn)如下:
一、A設(shè)備生成生成二維碼:
A設(shè)備向服務(wù)器請(qǐng)求getLoginCode接口,這個(gè)接口根據(jù)請(qǐng)求的sessionId進(jìn)行base64或其他加密方式進(jìn)行加密,然后以此作為二維碼的值,并將這個(gè)loginCode寫到redis里,設(shè)置5分鐘過期。然后將這個(gè)loginCode返回給A設(shè)備,A設(shè)備以此值來生成登陸的二維碼。
二、B設(shè)備掃碼授權(quán)
B設(shè)備來掃A設(shè)備的二維碼的時(shí)候,攜帶二維碼的值,請(qǐng)求授權(quán)登陸的接口scanConfirmLogin,此接口里先校驗(yàn)二維碼是否過期,沒過期的話進(jìn)行后面的業(yè)務(wù)邏輯處理,將用戶的基本信息和token寫到redis里。
三、A設(shè)備輪詢獲取授權(quán)狀態(tài)
B設(shè)備以每秒一次的頻率來刷 獲取用戶授權(quán)狀態(tài)接口,若狀態(tài)為已授權(quán),拿到用戶信息去做后面的邏輯處理。
/**
* 獲取掃描登陸的二維碼
* @param noncestr隨機(jī)字符串
* @throws Exception
*/
@RequestMapping(value = "user/getLoginCode.json")
public void getLoginCode(String noncestr,HttpServletRequest request,HttpServletResponse response) throws Exception {
if(StringUtil.isBlank(noncestr)){
apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT));
return;
}
//參數(shù)的有效性校驗(yàn)在攔截器里實(shí)現(xiàn)
int expirationTime=300; //時(shí)效5分鐘
final String sessionId=request.getSession().getId();
String loginCode=ToolUtils.getBase64(sessionId);
JedisUtil.set(loginCode, loginCode, expirationTime);
Map<String,Object> map=new HashMap<>();
map.put("loginCode", loginCode);
map.put("expirationTime", expirationTime);
apiData(request, response, ReqJson.ok(map));
}
/**
* 掃碼確認(rèn)登陸
* @param loginCode
* @param request
* @param response
* @throws Exception
*/
@RequestMapping(value = "user/scanConfirmLogin.json")
@AuthorizationApi
public void scanConfirmLogin(@CurrentToken final Token token,String loginCode,HttpServletRequest request,HttpServletResponse response) throws Exception {
if(StringUtil.isBlank(loginCode)){
apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT));
return;
}
String userId=token.getUserId();
Map<String,String> map=new HashMap<>();
String loginTicket=JedisUtil.get(loginCode);
if(StringUtil.isBlank(loginTicket)){
//二維碼過期
apiData(request, response,ReqJson.error(CommonError.TWO_DIMENSIONAL_CODE_HAS_EXPIRED));
return;
}
UserInfo userInfo = userInfoBiz.getUser(new UserInfo(userId));
if(userInfo==null){
apiData(request, response,ReqJson.error(UserError.USER_NOT_FOUND));
return;
}
//將用戶信息放在緩存中
map.put(BaseConfig.ACCESS_TOKEN, token.getAccessToken());
map.put("userId", userInfo.getUserId());
map.put("rongCloudToken", userInfo.getRongCloudToken());
map.put("identity", userInfo.getIdentity());
JedisUtil.setMap(loginCode+"scanConfirmLogin", map, 300);
apiData(request, response, ReqJson.ok(new Object()));
}
/**
* 獲取登陸狀態(tài)
* @param loginCode
* @param request
* @param response
* @throws Exception
*/
@RequestMapping(value = "user/getScanConfirmLoginStatus.json")
public void getLoginStatus(final String loginCode,HttpServletRequest request,HttpServletResponse response) throws Exception {
if(StringUtil.isBlank(loginCode)){
apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT));
return;
}
Map<String,String> map= JedisUtil.getMap(loginCode+"scanConfirmLogin");
if(map==null){
apiData(request, response,ReqJson.error(CommonError.AUTHORIZATION_HAS_EXPIRED));
return;
}
apiData(request, response, ReqJson.ok(map));
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序
這篇文章主要介紹了Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問題
這篇文章主要給大家介紹了關(guān)于Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問題,將依賴打入jar包,由于maven管理了所有的依賴,所以將項(xiàng)目的代碼和依賴打成一個(gè)包對(duì)它來說是順理成章的功能,需要的朋友可以參考下2023-10-10
java正則表達(dá)式的應(yīng)用 java讀取文件并獲取電話號(hào)碼
這篇文章主要介紹了java正則表達(dá)式的應(yīng)用,應(yīng)用的內(nèi)容是java讀取文件并獲取電話號(hào)碼,感興趣的小伙伴們可以參考一下2015-11-11
Java利用位運(yùn)算實(shí)現(xiàn)加減乘除的方法詳解
我們經(jīng)常使用的加減乘除,我們所看到的只是表面的效果,那么加減乘除在底層究竟是怎么實(shí)現(xiàn)的?今天就讓我們一探究竟2022-08-08
JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法
下面小編就為大家?guī)硪黄狫avaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10

