1、扫码登录实现实现概述
1.扫码登录实现过程:调用接口获取二维码—>扫码之后立即调用状态提示接口—>根据返回的状态页面做出相应的回应
本项目是一个相对较老的项目,具体代码如下:
获取二维码并且将获取到的二维码id写入jsp页面中,并且把二维码状态和二维码id保存到redis数据库中,设置有效时间为5分钟。
@Slf4j
public class QrCodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer=null;
WfyAuthResult2 result;
//二维码id
String scene;
Jedis jedis=null;
try {
//getData()方法返回的是二维码的状态,id信息
String wfySendResult=getData();
result = JSON.parseObject(wfySendResult,WfyAuthResult2.class);
scene=result.getRequestId();
writer=resp.getWriter();
writer.print(wfySendResult);
//创建redis实例
jedis=RedisUtil.getJedis();
//保存状态信息和二维码id到redis数据库
jedis.hset(scene,"sceneId",scene);
jedis.hset(scene,"stat","0");
jedis.expire(scene,5*60);
}catch (Exception e){
e.printStackTrace();
}finally {
writer.flush();
writer.close();
//释放redis资源
RedisUtil.returnResource(jedis);
}
}
接收扫码状态通知接口,手机扫码后告诉页面操作的结果,状态1是确认登录,挑战登录成功页面,状态2是取消登录,挑战登录界面,状态3是提示正在注册,刷新页面。
/**
* 接收扫码状态通知
* @param context
* @return
*/
public String receiveQrCodeStatus(ApplicationContext context){
JSONObject jsonObject=new JSONObject();
Jedis jedis=RedisUtil.getJedis();
String sceneId=jedis.hget(scene,"sceneId");
if (scene.equals(sceneId)) {
try{
if (sceneStatus.equals("1")) {
//确认登录,跳转登录页面
jedis.hset(scene,"stat","1");
jedis.expire(scene,5*60);
}
if (sceneStatus.equals("2")) {
//取消登录,关闭二维码,返回登录首页
jedis.hset(scene,"stat","2");
jedis.expire(scene,5*60);
}
if (sceneStatus.equals("3")) {
//提示手机端进行注册,请稍后
jedis.hset(scene,"stat","3");
jedis.expire(scene,5*60);
} if (sceneStatus.equals("4")) {
//提示二维码处于已扫码状态
jedis.hset(scene,"stat","4");
jedis.expire(scene,60*60*24);
}
}catch (Exception e){
e.printStackTrace();
}finally {
RedisUtil.returnResource(jedis);
}
jsonObject.put("code", "200");
jsonObject.put("result", true);
jsonObject.put("message","成功");
return jsonObject.toString();
}else {
jsonObject.put("code", "204");
jsonObject.put("result", false);
jsonObject.put("message","扫码失败,二维码已过期");
return jsonObject.toString();
}
}
回调接口,在点击确认登录之前,会先调用这个接口,返回登录信息,包括身份证号码,姓名和性别等,将登录所需的信息保存到redis服务器中
/**
* 回调接口
* @param context
* @return
*/
public String wfyQRcodeLogin(ApplicationContext context){
JSONObject jsonObject=new JSONObject();
Jedis jedis=RedisUtil.getJedis();
String sceneId=jedis.hget(scene,"sceneId");
if (scene.equals(sceneId)){
try{
jedis.hset(scene,"stat","0");
jedis.hset(scene,"sfzhm",sfzhm);
jedis.hset(scene,"name",name);
jedis.hset(scene,"nickname",nickname);
jedis.hset(scene,"sex",sex);
if (phone==null){
jedis.hset(scene,"phone","1");
}else {
jedis.hset(scene, "phone", phone);
}
jedis.expire(scene,5*60);
}catch (Exception e){
e.printStackTrace();
}finally {
RedisUtil.returnResource(jedis);
}
jsonObject.put("code", "200");
jsonObject.put("result", true);
jsonObject.put("message","成功");
return jsonObject.toString();
}else {
jsonObject.put("code", "204");
jsonObject.put("result", false);
jsonObject.put("message","二维码已过期");
return jsonObject.toString();
}
}
jsp页面信息
<html>
<head>
<script type="text/javascript" src="<%=path%>/js/jquery-1.4.2.min.js"></script>
<title>欢迎登录</title>
<script>
//页面加载完成,异步加载获取二维码页面
var scene=null;
$(function(){
getCode();
$.ajax({
type:"post",
url:"QrCodeServlet",
data:{},
dataType:"json",
success:function (res) {
scene=res.requestId;
$("#scene1").attr("value",scene);
$("#iamge").attr("src","data:image/gif;base64,"+res.data)
}
})
});
//页面轮询方法,查询二维码的状态
function getCode() {
var checkLogin=setInterval(
function () {
$.ajax({
type:"post",
url:"getStatus",
data:{"sceneId":scene},
dataType:"json",
success:function (stat) {
if (stat == "null") {
alert("二维码已过期,请重新刷新页面");
clearInterval(checkLogin);
} else if (stat == 1) {
//确认登录,跳转登录认证页面,认证成功则登录完成
$(function(){
$('#qr_login').submit();
});
window.close();
clearInterval(checkLogin);
} else if (stat == 2) {
//取消登录,返回登录页面
window.location.href = "login_zjgy.jsp";
clearInterval(checkLogin);
} else if (stat == 3) {
//提示用户正在注册,完成后刷新页面
alert("正在进行注册,注册完成后刷新页面重新获取二维码");
clearInterval(checkLogin);
} else if (stat == 4) {
//提示已扫码
alert("已扫码");
}
}
})
},1000)
}
</script>
</head>
<body>
<img src="" id="iamge" >
<form id="qr_login" action="QrLoginServlet" method="post" style="display: none">
<input id="scene1" name="sceneId" value="" style="display: none">
</form>
</body>
</html>
轮询查状态接口,页面轮询查询状态,根据查询到的状态跳转页面
public class GetStatusServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer=null;
String scene;
Jedis jedis=null;
String stat;
try{
//从页面获取id,根据二维码i从redis数据库中查询二维码状态
scene=req.getParameter("sceneId");
jedis=RedisUtil.getJedis();
stat = jedis.hget(scene,"stat");
writer=resp.getWriter();
writer.print(stat);
}catch (Exception e){
e.printStackTrace();
}finally {
writer.flush();
writer.close();
//关闭资源
RedisUtil.returnResource(jedis);
}
}
}
登录页面,根据身份证等信息进行登录
public class QrLoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取二维码id,根据id从redis中获取数据
String scene=req.getParameter("sceneId");
Jedis jedis=RedisUtil.getJedis();
String sfzhm=jedis.hget(scene,"sfzhm");
String name=jedis.hget(scene,"name");
JSONObject tokenObj = new JSONObject();
tokenObj.put("name",name);
tokenObj.put("time",System.currentTimeMillis());
tokenObj.put("sfzh",sfzhm);
RequestDispatcher de = null;
req.setAttribute("resInfoObj", tokenObj);
........
//后面的代码不方便写出
}
}