全⽹最全的扫码登录实现⽅案
1.什么是扫码登录?
web端登录,为了实现⽅便性以及安全性,展⽰⼆维码,APP端扫码,完成登录流程,要求:⾃⼰的web服务,⾃⼰的APP(使⽤第三⽅登录QQ);⼤致流程如下:
2.技术难点
⼿机扫码完成后调⽤后端登录接⼝,完成登录,这⾥服务器需要通知前端说我已经登录完成,你可以开始跳转了;说⽩了就是服务器向客户端推送消息的流程;
3.⼆维码⽣成
java端使⽤google的zxing包,⽣成⼆维码;将⼆维码⼀Base64的⽅式传到前端;Google的依赖是:
<dependency>
<groupId&le.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
⼆维码⽣成以及转Base⼯具类下载链接: pan.baidu/s/14r4OTBQlB236YYYu3Uav3w
3.实现⽅案
1.最实⽤运⽤最⼴的实现⽅案(90%使⽤率)
前端轮询实现,⽬前运⽤的企业:CSDN,⽀付宝,京东等
2.短连接+轮询 -- polling(即时)
⽹页版扫码登录;
何为短连接:客户端向后端发送请求,后端没有消息推送客户端,则阻塞当前线程,等N秒后,仍没有消息,response前端;
前端:
先看的前端场景:
如⽆消息,在阻塞20秒左右响应408,并开启新的请求:
则前端只需要保证收到错误的状态码,重新发起请求即可;
后端:
Tomcat连接数有限,如果⼀个连接需要占⽤连接20秒,那么⽤户⼀多连接数很快消耗殆尽,这⾥需要使⽤DeferredResult来异步实现;具体实现⽅法看: Redis(list+blpop):redis存储⽤户是否扫码登录成功;基于redis和blpop来实现没有消息阻塞后端线程固定时间;(这⾥只说具体思路)
3.websocket
基于netty-socketIO实现web端和服务端通信;具分布式部署⽅案以及相关信息见:
4.第三⽅goeasy消息即时通信
即时,不占⽤服务器资源,开发简单,总知哪都好就是“要钱”;确定:并发量⼩,服务真的贵,⾃⼰使⽤websocket轻松可以实现2万的并发
下⾯说下简单的实现:
4.1:进⼊官⽹:asy.io ;创建免费应⽤
后端:下载相应依赖,代码如下:
@Controller
@RequestMapping("/goeasy")
public class GoEasyController {
@ResponseBody
@RequestMapping(value = "/sendMessage", method = RequestMethod.POST)
public void readMessage(@RequestBody String channel) {
GoEasy goEasy = new GoEasy( "asy.io", "BC-d7920b8c7567461d8042935546fc3360");
goEasy.publish(channel,"Hello, GoEasy!", new PublishListener(){
@Override
public void onSuccess() {
System.out.print("消息发布成功。");
}
@Override
public void onFailed(GoEasyError error) {
System.out.print("消息发布失败, 错误编码:" + Code() + " 错误信息: " + Content());
}
});
}
}web端登录
前端:导⼊对应的js⽂件:
由于我是使⽤的Angular,这⾥通过这个js对其简单的封装;
在ts中在⽤到的地⽅,然后直接调⽤ 5.基于SSE实现
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论