JAVA web App扫码登录

思路:web请求1接口,得到一个sessionId,后端将sessionId缓存起来,并设置有效期。将sessionId返回给web端,web端将sessionId生成二维码。然后web端每隔3/5秒请求一下轮询接口,判断缓存的sessionId是否正常,app扫码之后获取到sessionId,然后请求接口3,将sessionId和账号(或者token等唯一信息),如果APP在线则更新缓存数据,此时如果web端轮询sessionId缓存的值发生变化则校验是否授权登录成功。

1:web端请求服务端获取到sessionId,将sessionId设置一个过期时间存入redis

@ApiOperation("前端生成二维码,请求绑定关系,二维码过期时间30秒")
@PostMapping("/request")
public AjaxResult request(HttpServletRequest request) {
    String id = request.getSession().getId();
    redisService.set(id, id, 30);
    return AjaxResult.success("", id);
}

2:轮询,返回给前端信息

@ApiOperation("前端轮询该接口,扫码登录之后返回信息")
@PostMapping("/loopCode")
public AjaxResult loopCode(String sessionId) {
   Object o = redisService.get(sessionId);
   if (ObjectUtils.isEmpty(o)) {
       return AjaxResult.error("二维码已过期");
   }
   // APP端扫码认证成功之后将1中的缓存sessionId 更新为success或者自定义值
   if (o.toString().equals("success")) {
      // 将令牌和用户信息返回给web端跳转即可
      String mobile = (String) redisService.get(sessionId + "login");
      String token = (String) redisService.get(sessionId + mobile);
      AppUser user = tokenManage.getUser(token);
      Map map = new HashMap();
      map.put("token", token);
      map.put("user", user);
      return AjaxResult.success(map);
    }
    return new AjaxResult(AjaxResult.Type.SCAN_CODE, "扫码中");
}

3:扫码登录,app请求之后获取到二维码中的sessionId,将sessionId和手机号在缓存中绑定,并修改1中的缓存value

 @ApiOperation("扫码登录")
    @PostMapping("/scanLogin")
    public AjaxResult scanLogin(String mobile, String sessionId) {
        Object o = redisService.get(sessionId);
        if (ObjectUtils.isEmpty(o)) {
            return AjaxResult.error("无效码");
        }
        AppUser appUser = appUserService.selectAppUserByPhonenumber(mobile);
        String token = tokenManage.getToken(appUser);
        if (ObjectUtils.isEmpty(token)) {
            return new AjaxResult(APP_AUTH_LOGIN, "令牌已过期,请重新登录");

        }
        redisService.set(sessionId, "success", 20);
        redisService.set(sessionId + "login", mobile, 20);
        redisService.set(sessionId + mobile, token,20);
        return AjaxResult.success();
    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值