实现扫码登录,及扫码登录的原理理解(javaweb实现扫码登陆)

1.首先看下实现的思路
大概思路就是这样的
2.废话不多说上代码
第一步(后端生成临时令牌及存储起来)

	//存储二维码维一临时令牌
			public static Set<String> tokens = new HashSet<>();
			//存储toke绑定的用户key为tokens令牌 value 为userinfo信息
			public static Map<String,Object> usersmap = new HashMap<String,Object>();
			//标记二维码的状态有没有被扫过
			public static Map<String,Object> usersstatus = new HashMap<String,Object>();
			//生成二维码
		@RequestMapping("getQRcode")
		@ResponseBody
		public Map<String,Object> getQRcode(){
			Map<String,Object> map =new HashMap<String, Object>();
			String uid = UUID.randomUUID().toString();
			tokens.add(uid);
			map.put("uid", uid);
			return map;
		}
		
第二步 页面(我用的时jsp)生成二维码 同时轮询后台
//生成二维码
$.ajax({
   			 	type:"post",
   				url:"${pageContext.request.contextPath}/app/getQRcode",
   				dataType:"json",
   				success:function(data){
   					   new QRCode(document.getElementById('qrcode'),{text:"http://ip:port/project?token="+临时令牌,height:200,width:200});
   			           
   				}
   		});


//开始轮询
var t2 = window.setInterval(function() {
        		 var token = $('#token').val();
        		 if(token){
        			 $.ajax({
        				 	type:"post",
        				 	data:{"token":token},
        url:"${pageContext.request.contextPath}/app/scanLogin",
        					success:function(data){
        						console.log(data.code);
        						if(data.code==200){
        							clearInterval(t2);
        	                        window.location.href = "${pageContext.request.contextPath}/*/main";
        						}else if(data.code==300){
        							$("#qrcode").attr("style","filter: blur(3px);");
        							layer.msg(data.name+"扫码成功");
        							//失效时间
        							setTimeout(qingli,300000);
        						}
        					}
        					});
        			 
        		 }
        		},1000)

第 三步 扫码
1.app拿到token和用户信息去绑定

@ResponseBody
		@RequestMapping("bindinguser")
		public String bindinguser(String loginName, String token,String pwd,HttpSession httpsession){
			System.err.println(loginName+"--"+"---"+token+"-----"+pwd);
			for (String t:tokens) {
				if(t.equals(token)){
					 QueryWrapper<Account> queryWrapper=new QueryWrapper<>();
					 queryWrapper.eq("account_loginname", loginName);
					 queryWrapper.eq("account_loginpassword", pwd);
					 Account accounts =accountService.findone(queryWrapper);
					 usersmap.put(token,accounts);
					 usersstatus.put(token, "FALSE");
					return "200";
				}
			}
			return "100";
		}

2.返回给app绑定成功 去确认登录 (此时页面轮询得知绑定用户)

@ResponseBody
		@RequestMapping("Confirmlogin")
		public String determine(String token){
			usersstatus.put(token, "TRUE");
			return "200";
		}

3.此时的所有条件都齐全

//轮询登录
		@RequestMapping("scanLogin")
		@ResponseBody
		public Map<String,Object> scanLogin(String token,HttpSession httpsession) {
			Map<String,Object> map =new HashMap<String, Object>();
			if(token==null) {
				map.put("code", 100);
			}
			if(usersmap.get(token)!=null && usersstatus.get(token).equals("TRUE")) {
				//这写自己的登录方法
				
				map.put("code", 200);
				usersmap.remove(token);
				usersstatus.remove(token);
				tokens.remove(token);
				return map;
			}else if(usersmap.get(token)!=null && usersstatus.get(token).equals("FALSE") ){
			//通知页面谁扫码了等待确认
				用户信息 userinfo = usersmap.get(token);
				map.put("user",userinfo );
				map.put("code",300);
				return map;
			}
			map.put("code", 0);
			return map;
		}

到这基本上流程是完了。(app的扫码与web的通信之前的博客有写大家感兴趣的可以去看看)

感兴趣的可以试试!有什么问题评论就可以了!

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值