假设现在有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")@AuthorizationApipublic 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));}

Java实现二维码扫码授权登陆相关推荐

  1. Java如何实现二维码扫码授权登陆

    如今的生活中,登录网站也变得如此简单,当你已经登录一微信时,当你想要登录另一个网站时,只需扫码便可,可是大家知道用Java怎么实现扫码授权吗?本文讲述的就是关于如何用Java实现扫码授权登录,一起来了 ...

  2. JAVA实现二维码扫码登录

    实现客户端扫码登录分为下列四步: 1. Web页面生成二维码 生成的二维码中必须要包含一个用于唯一标识用户的数据,这个唯一标识是为了确保将客户端(手机)与web网页绑定,避免其他人登录了你的账号.在这 ...

  3. 手机二维码扫码登录(Java源码及思路)

    QRCodeLogin 二维码扫码登录:服务器端.网页端.移动端源码: 项目介绍 一个二维码扫码登录的demo,能够完整的实现用户扫码登录的过程,源码地址. 项目一共包含三分源码:服务器端.网页端和移 ...

  4. PHP实现二维码扫码登录

    实现客户端扫码登录分为下列四步: 1.    Web页面生成二维码 生成的二维码中必须要包含一个用于唯一标识用户的数据,这个唯一标识是为了确保将客户端(手机)与web网页绑定,避免其他人登录了你的账号 ...

  5. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

  6. spring boot高性能实现二维码扫码登录(上)——单服务器版

    前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...

  7. C++实现二维码扫码登录

    实现客户端扫码登录分为下列四步: 1.    Web页面生成二维码 生成的二维码中必须要包含一个用于唯一标识用户的数据,这个唯一标识是为了确保将客户端(手机)与web网页绑定,避免其他人登录了你的账号 ...

  8. java生成二维码,并在前端展示。

    java生成二维码,并在前端展示,扫码实现下载功能. 后端生成二维码以流的形式 前端接收二维码并展示 后端生成二维码以流的形式 这是以流的形式展示二维码.当然也可以以文件的格式,文件格式就是Path ...

  9. python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)

    python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性) 昨日内容回顾 1.app播放音乐plus.audio.createPlayer(文件路径/URL)player.play( ...

  10. java生成二维码(链接生成二维码)

    Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...

最新文章

  1. python 修改字符串中的某个单词_python Pandas替换字符串中的单词
  2. POJ 3040 贪心
  3. poj1050 To the Max
  4. ipaddr库计算区间IP及CIDR的IP段
  5. boost::fusion::make_fused_procedure用法的测试程序
  6. React Native发布重构路线图
  7. 零售业有效利用物联网的几种方法
  8. 总结JavaScript中的继承
  9. 如何对MacBook上坏掉的USB-C接口进行故障排除?
  10. 如何在不确定经济形势下把握好企业脉搏
  11. Raki的读paper小记:GloVe: Global Vectors for Word Representation
  12. keyshot怎么批量渲染_怎样用keyshot 5.0快速渲染出高质量图
  13. Python将PDF转换为图片
  14. caption重要性 image_Multimodal —— 看图说话(Image Caption)任务的论文笔记(一)评价指标和NIC模型...
  15. 【PA2011】Kangaroos
  16. 1.1 区块链专业术语(中英对照)
  17. 春节钱包大流量奖励系统入账及展示的设计与实现
  18. 沉睡者IT - 抖音中视频计划赚钱项目初级教程
  19. 【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()
  20. 78㎡网络机房动环监控及告警方案

热门文章

  1. 一个轻量级多功能免费开源web聊天室
  2. ubuntu18.04安装中文输入法ibus
  3. Windows批处理-for命令详解
  4. 我工作第五年的学习与读书之法
  5. PDF Converter 注册码
  6. android实现语音聊天功能,为实现Android语音聊天室开发,语音聊天室软件源码该如何搭建...
  7. Unity性能优化之物理引擎的优化(三)
  8. oracle没有卸载,oracle卸载没有正确卸载怎么办?
  9. oracle财务系统名称,Oracle财务系统总账模块操作手册
  10. Firefox浏览器购物比价插件:惠惠购物助手