假設現在有2個設備,a設備需要掃碼授權登陸,b設備是已經登陸了的設備。然后實現如下:
一、a設備生成生成二維碼:
a設備向服務器請求getlogincode接口,這個接口根據請求的sessionid進行base64或其他加密方式進行加密,然后以此作為二維碼的值,并將這個logincode寫到redis里,設置5分鐘過期。然后將這個logincode返回給a設備,a設備以此值來生成登陸的二維碼。
二、b設備掃碼授權
b設備來掃a設備的二維碼的時候,攜帶二維碼的值,請求授權登陸的接口scanconfirmlogin,此接口里先校驗二維碼是否過期,沒過期的話進行后面的業務邏輯處理,將用戶的基本信息和token寫到redis里。
三、a設備輪詢獲取授權狀態
b設備以每秒一次的頻率來刷 獲取用戶授權狀態接口,若狀態為已授權,拿到用戶信息去做后面的邏輯處理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/** * 獲取掃描登陸的二維碼 * @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 ; } //參數的有效性校驗在攔截器里實現 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())); } /** * 獲取登陸狀態 * @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)); } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_33556185/article/details/80060764