java实现二维码扫码授权登陆

2025-05-29 0 85

假设现在有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));

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://blog.csdn.net/qq_33556185/article/details/80060764

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java实现二维码扫码授权登陆 https://www.kuaiidc.com/111072.html

相关文章

发表评论
暂无评论