Java实现二维码扫码授权登陆
假设现在有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实现二维码扫码授权登陆相关推荐
- Java如何实现二维码扫码授权登陆
如今的生活中,登录网站也变得如此简单,当你已经登录一微信时,当你想要登录另一个网站时,只需扫码便可,可是大家知道用Java怎么实现扫码授权吗?本文讲述的就是关于如何用Java实现扫码授权登录,一起来了 ...
- JAVA实现二维码扫码登录
实现客户端扫码登录分为下列四步: 1. Web页面生成二维码 生成的二维码中必须要包含一个用于唯一标识用户的数据,这个唯一标识是为了确保将客户端(手机)与web网页绑定,避免其他人登录了你的账号.在这 ...
- 手机二维码扫码登录(Java源码及思路)
QRCodeLogin 二维码扫码登录:服务器端.网页端.移动端源码: 项目介绍 一个二维码扫码登录的demo,能够完整的实现用户扫码登录的过程,源码地址. 项目一共包含三分源码:服务器端.网页端和移 ...
- PHP实现二维码扫码登录
实现客户端扫码登录分为下列四步: 1. Web页面生成二维码 生成的二维码中必须要包含一个用于唯一标识用户的数据,这个唯一标识是为了确保将客户端(手机)与web网页绑定,避免其他人登录了你的账号 ...
- spring boot高性能实现二维码扫码登录(中)——Redis版
前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...
- spring boot高性能实现二维码扫码登录(上)——单服务器版
前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...
- C++实现二维码扫码登录
实现客户端扫码登录分为下列四步: 1. Web页面生成二维码 生成的二维码中必须要包含一个用于唯一标识用户的数据,这个唯一标识是为了确保将客户端(手机)与web网页绑定,避免其他人登录了你的账号 ...
- java生成二维码,并在前端展示。
java生成二维码,并在前端展示,扫码实现下载功能. 后端生成二维码以流的形式 前端接收二维码并展示 后端生成二维码以流的形式 这是以流的形式展示二维码.当然也可以以文件的格式,文件格式就是Path ...
- python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)
python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性) 昨日内容回顾 1.app播放音乐plus.audio.createPlayer(文件路径/URL)player.play( ...
- java生成二维码(链接生成二维码)
Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...
最新文章
- python 修改字符串中的某个单词_python Pandas替换字符串中的单词
- POJ 3040 贪心
- poj1050 To the Max
- ipaddr库计算区间IP及CIDR的IP段
- boost::fusion::make_fused_procedure用法的测试程序
- React Native发布重构路线图
- 零售业有效利用物联网的几种方法
- 总结JavaScript中的继承
- 如何对MacBook上坏掉的USB-C接口进行故障排除?
- 如何在不确定经济形势下把握好企业脉搏
- Raki的读paper小记:GloVe: Global Vectors for Word Representation
- keyshot怎么批量渲染_怎样用keyshot 5.0快速渲染出高质量图
- Python将PDF转换为图片
- caption重要性 image_Multimodal —— 看图说话(Image Caption)任务的论文笔记(一)评价指标和NIC模型...
- 【PA2011】Kangaroos
- 1.1 区块链专业术语(中英对照)
- 春节钱包大流量奖励系统入账及展示的设计与实现
- 沉睡者IT - 抖音中视频计划赚钱项目初级教程
- 【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()
- 78㎡网络机房动环监控及告警方案