java實現(xiàn)二維碼掃碼授權(quán)登陸
假設(shè)現(xiàn)在有2個設(shè)備,A設(shè)備需要掃碼授權(quán)登陸,B設(shè)備是已經(jīng)登陸了的設(shè)備。然后實現(xiàn)如下:
一、A設(shè)備生成生成二維碼:
A設(shè)備向服務(wù)器請求getLoginCode接口,這個接口根據(jù)請求的sessionId進行base64或其他加密方式進行加密,然后以此作為二維碼的值,并將這個loginCode寫到redis里,設(shè)置5分鐘過期。然后將這個loginCode返回給A設(shè)備,A設(shè)備以此值來生成登陸的二維碼。
二、B設(shè)備掃碼授權(quán)
B設(shè)備來掃A設(shè)備的二維碼的時候,攜帶二維碼的值,請求授權(quán)登陸的接口scanConfirmLogin,此接口里先校驗二維碼是否過期,沒過期的話進行后面的業(yè)務(wù)邏輯處理,將用戶的基本信息和token寫到redis里。
三、A設(shè)備輪詢獲取授權(quán)狀態(tài)
B設(shè)備以每秒一次的頻率來刷 獲取用戶授權(quán)狀態(tài)接口,若狀態(tài)為已授權(quán),拿到用戶信息去做后面的邏輯處理。
/**
* 獲取掃描登陸的二維碼
* @param noncestr隨機字符串
* @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ù)的有效性校驗在攔截器里實現(xiàn)
int expirationTime=300; //時效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));
}
/**
* 掃碼確認登陸
* @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));
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用LinkedHashMap進行分數(shù)排序
這篇文章主要介紹了Java使用LinkedHashMap進行分數(shù)排序的相關(guān)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
Maven打包所有依賴到一個可執(zhí)行jar中遇到的問題
這篇文章主要給大家介紹了關(guān)于Maven打包所有依賴到一個可執(zhí)行jar中遇到的問題,將依賴打入jar包,由于maven管理了所有的依賴,所以將項目的代碼和依賴打成一個包對它來說是順理成章的功能,需要的朋友可以參考下2023-10-10
java正則表達式的應(yīng)用 java讀取文件并獲取電話號碼
這篇文章主要介紹了java正則表達式的應(yīng)用,應(yīng)用的內(nèi)容是java讀取文件并獲取電話號碼,感興趣的小伙伴們可以參考一下2015-11-11

