欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-27 22:21:27
假设现在有2个设备,a设备需要扫码授权登陆,b设备是已经登陆了的设备。然后实现如下: 一、a设备生成生成二维码: a设备向服务器请求getlogincode接口,这个接...

假设现在有2个设备,a设备需要扫码授权登陆,b设备是已经登陆了的设备。然后实现如下:

一、a设备生成生成二维码:

a设备向服务器请求getlogincode接口,这个接口根据请求的sessionid进行base64或其他加密方式进行加密,然后以此作为二维码的值,并将这个logincode写到redis里,设置5分钟过期。然后将这个logincode返回给a设备,a设备以此值来生成登陆的二维码。

二、b设备扫码授权

b设备来扫a设备的二维码的时候,携带二维码的值,请求授权登陆的接口scanconfirmlogin,此接口里先校验二维码是否过期,没过期的话进行后面的业务逻辑处理,将用户的基本信息和token写到redis里。

三、a设备轮询获取授权状态

b设备以每秒一次的频率来刷 获取用户授权状态接口,若状态为已授权,拿到用户信息去做后面的逻辑处理。

 /**
 * 获取扫描登陆的二维码
 * @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));
 }

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