、⽀付宝⽹页端扫码登录实现原理
与⽀付宝的扫码登录是有⼀些区别的,⽬前是⼀个持续27s的长连接请求;⽽⽀付宝是持续循环的短连接请求。其实原理是⼀样的。
⾸先,前端调⽤⼆维码接⼝,获取图⽚⼆维码以及⽤户唯⼀表⽰uid,然后与服务器建⽴长连接请求,询问是否有⽤户扫码登录。
⽤户⽤APP扫码之后,会请求服务器接⼝,将⽤户信息与⼆维码的uid绑定,前端的长连接就可以请求到当前uid对应的⽤户,从⽽进⾏登录操作。
前端的长连接请求类似以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script src="code.jquery/jquery-latest.js"></script>
<body>
<div id="divCon">
<img src="" id="QrCodeImg" />
</div>
</body>
<script type="text/javascript">
$(document).ready(function() {
var uuid = 131422035;
function validateLogin(){
$.get("/walletadminV2/api/testServlet/testLogin?uuid=" + uuid , function(data, status) {
if(data == ""){
validateLogin();
}else{
var obj = eval("(" + data + ")");
alert("登录成功了:" + obj.uname);
}
});
}
validateLogin();
});
</script>
</html>
后台代码类似:
public class TestLogin extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uid = Parameter("uid");
String jsonStr = "";
System.out.println("in");
System.out.println("uid:" + uid);
long inTime = new Date().getTime();
Boolean bool = true;
while (bool) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//检测登录
可以⽤Redis来实现登录检测
if(userVo != null){
bool = false;
...
}else{
if(new Date().getTime() - inTime > 5000){
bool = false;
}
}
}
System.out.println("login ok : " + jsonStr);
PrintWriter out = Writer();
out.print(jsonStr);
网页appout.flush();
out.close();
}
}
获取登录⼆维码以及uid的接⼝,已经APP端确认登录的接⼝⽐较简单,就不提供了。⼤致思路就是以上这样。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论