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

