扫码登录_扫码登录实现 - CSDN
精华内容
参与话题
  • 扫码登录实现原理解析

    千次阅读 2018-10-28 18:15:32
    1.浏览器生成一个二维码,二维码里面包含微信的URL和一个随机的UUID,并轮旬给服务器发消息 2.客户端扫描二维码,得到一个把用户的信息和UUID绑定,发送给服务器 3.服务器拿到这个用户的信息和UUID ...

    1.浏览器生成一个二维码,二维码里面包含微信的URL和一个随机的UUID,并轮旬给服务器发消息

    2.客户端扫描二维码,得到一个把用户的信息和UUID绑定,发送给服务器

    3.服务器拿到这个用户的信息和UUID

    4.浏览器请求消息,服务器拿到用户的信息,进行更新

    展开全文
  • 二维码扫码登录

    千次阅读 2018-07-05 10:31:14
    项目结构模块介绍流程1pc端:1:打开二维码登录网页index.html2:index.html调用GetQrCodeServlet3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识,该标识贯穿整个流程 b:生成二维码图片,二维码信息:...

       项目结构



    模块介绍


    流程1

    pc端:

    1:打开二维码登录网页index.html
    2:index.html调用GetQrCodeServlet
    3:GetQrCodeServlet干2件事
       a:生成随机的uuid,是一个唯一标识,该标识贯穿整个流程
       b:生成二维码图片,二维码信息:http://60.28.201.37:8380/QrCodeLoginPro/Login.html?uuid=" + uuid
    4:index页面展示二维码
    5:index页面调用LongConnectionCheckServlet进行长连接轮询操作,参数为uuid
    6:LongConnectionCheckServlet只干1件事
       a:拿到uuid后循环检查loginUserMap中uuid是否不为null。
    7:如果为null则代表没有登录,index.html将继续进行轮询

    ps:
    LongConnectionCheckServlet  一个长连接请求检测登录状态

    loginUserMap 是一个静态的map结构的登录池,uuid为key , 登录信息为value

    流程2

    手机端:


    1:扫描pc端的二维码
    2:打开二维码中的网页 http://60.28.201.37:8380/QrCodeLoginPro/Login.html?uuid=" + uuid
    3:登录,将uname upwd uuid 传递给登录程序PhoneLoginServlet
    4:PhoneLoginServlet干2件事
       a:检测登录
       b:登录成功后将登录信息插入到loginUserMap中去,uuid为key

    pc端:
    1:继续轮询检测uuid中是否为null,

    2:登录后的uuid中就不为null了,此时LongConnectionCheckServlet停止循环,返回登录状态。

    LongConnectionCheckServlet.java

    package cn;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.vo.LoginUserVo;
    import cn.vo.UserVo;
    
    /**
     * 用长连接,检查登录状态
     *
     */
    public class LongConnectionCheckServlet 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 uuid = request.getParameter("uuid");
        	String jsonStr = "";
    		System.out.println("in");
    		System.out.println("uuid:" + uuid);
    		long inTime = new Date().getTime();
    		Boolean bool = true;
    		while (bool) {
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			//检测登录
    			UserVo userVo = LoginUserVo.getLoginUserMap().get(uuid);
    			System.out.println("userVo:" + userVo);
    			if(userVo != null){
    				bool = false;
    				jsonStr = "{\"uname\":\""+userVo.getUname()+"\"}";
    				LoginUserVo.getLoginUserMap().remove(uuid);
    			}else{
    				if(new Date().getTime() - inTime > 5000){
    					bool = false;
    				}
    			}
    		}
    		System.out.println("login ok : " + jsonStr);
    		PrintWriter out = response.getWriter();
    		out.print(jsonStr);
    		out.flush();
    		out.close();
    	}
    }
    

    GetQrCodeServlet.java

    package cn;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.util.TwoDimensionCode;
    
    /**
     * 生成二维码图片以及uuid
     *
     */
    public class GetQrCodeServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		doPost(request, response);
    	}
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		PrintWriter out = response.getWriter();
    		
    		//生成唯一ID
    		int uuid = (int) (Math.random() * 100000);
    		//二维码内容
    		String content = "http://127.0.0.1:8080/QrCodeLoginPro/Login.html?uuid=" + uuid;
    		//生成二维码
    		String imgName =  uuid + "_" + (int) (new Date().getTime() / 1000) + ".png";
    		String imgPath = "F://apache-tomcat-7/webapps/QrCodeLoginPro/" + imgName;
    		TwoDimensionCode handler = new TwoDimensionCode();
    		handler.encoderQRCode(content, imgPath, "png");
    		
    		//生成的图片访问地址
    		String qrCodeImg = "http://127.0.0.1:8080/QrCodeLoginPro/" + imgName;
    		String jsonStr = "{\"uuid\":" + uuid + ",\"qrCodeImg\":\"" + qrCodeImg + "\"}";
    		out.print(jsonStr);
    		out.flush();
    		out.close();
    	}
    }
    

    PhoneLoginServlet.java

    package cn;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.vo.LoginUserVo;
    import cn.vo.UserVo;
    
    /**
     * 二维码手机端登录
     *
     */
    public class PhoneLoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
        public PhoneLoginServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doPost(request, response);
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String uuid = request.getParameter("uuid");
    		String uname = request.getParameter("uname");
    		String upwd = request.getParameter("upwd");
    		System.out.println(uuid);
    		System.out.println(uname);
    		System.out.println(upwd);
    		//验证登录
    		boolean bool = true;
    		if(bool){
    			//将登陆信息存入map
    			UserVo userVo = LoginUserVo.getLoginUserMap().get(uuid);
    			if(userVo == null){
    				userVo = new UserVo();
    				userVo.setUname(uname);
    				userVo.setUpwd(upwd);
    				LoginUserVo.getLoginUserMap().put(uuid, userVo);
    			}
    		}
    		PrintWriter out = response.getWriter();
    		out.print(bool);
    		out.flush();
    		out.close();
    	}
    }
    

    项目下载地址:https://pan.baidu.com/s/1dwSBbqqdNPFk6LMzmpJY2A

                                                                   本文转载地址:https://blog.csdn.net/lwjdear/article/details/78427791

    展开全文
  • 微信扫码登录demo

    2020-07-30 23:30:12
    微信扫码登录demo
  • 扫码登录 简单实现

    2018-06-29 18:21:19
    简单原理是 服务器生成唯一的 key 附带到login 上用户扫描 二维码 并且访问服务器 服务器反馈登录 状态前端 页面 每隔一段时间扫描 服务器 当前的key是否扫描, 然后后续操作代码:package mainimport ...

    简单原理是 服务器生成唯一的 key  附带到login 上
    用户扫描 二维码 并且访问服务器 服务器反馈登录  状态
    前端 页面 每隔一段时间扫描 服务器 当前的key是否扫描, 然后后续操作


    代码:


    package main
    
    import (
    	"fmt"
    	"io"
    	"math/rand"
    	"net/http"
    	"time"
    
    	. "github.com/soekchl/myUtils"
    )
    
    const file = `
    <!DOCTYPE html>
    <html lang="zh-ch">
    
    <head>
      <meta charset="UTF-8">
      <title>扫码</title>
    </head>
    
    <body>
     <br>
    
       <p>扫码登录</p>
       <img id="keyImage" src="http://qr.liantu.com/api.php?text=%v" alt="My Eth Address" title="My ETH Address">
    
    
    
      <br>
      <br>
    </body>
    <script>
    
    
     setInterval("checkLogin()","1000");
    
      function checkLogin() {
        var xhr = ajaxFunction();
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4) {
            if (xhr.status == 200) {
              // 解析 数据字段 按照js的名称来给
              console.log(xhr.responseText, keyImage.src.slice(67,123))
              if (+xhr.responseText === 1) {
                alert('登录成功')
                location.reload()
              } else {
    //            alert('Server Error!...')
              }
    
            }
          }
        }
        xhr.open("get", "http://10.0.82.88:8080/checkLogin?key="+keyImage.src.slice(67,123), true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded','Access-Control-Allow-Origin', '*');
            xhr.send("");
      }
    
      function ajaxFunction() {
        let xmlHttp;
        try { // Firefox, Opera 8.0+, Safari
          xmlHttp = new XMLHttpRequest();
        } catch (e) {
          try { // Internet Explorer
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
          } catch (e) {
            try {
              xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) { }
          }
        }
        return xmlHttp;
      }
    </script>
    
    </html>
    `
    
    var (
    	keyMap = make(map[string]int)
    )
    
    func HelloServer(w http.ResponseWriter, req *http.Request) {
    	rand.Seed(time.Now().UnixNano())
    	r := rand.Int()
    	keyMap[fmt.Sprint(r)] = 1
    	url := fmt.Sprint("http://10.0.82.88:8080/login?key=", r)
    	Notice(url)
    	io.WriteString(w, fmt.Sprintf(file, url))
    }
    
    func main() {
    	http.HandleFunc("/", HelloServer)
    	http.HandleFunc("/login", login)
    	http.HandleFunc("/checkLogin", checkLogin)
    
    	Notice("Server Start!")
    	err := http.ListenAndServe(":8080", nil)
    	if err != nil {
    		panic("ListenAndServe: " + err.Error())
    	}
    }
    
    func login(w http.ResponseWriter, req *http.Request) {
    	key := req.FormValue("key")
    	if keyMap[key] == 1 {
    		Notice("login ok ", key)
    		io.WriteString(w, fmt.Sprintf("<script> alert('%v 登录成功')</script>", key))
    		Notice(len(key))
    		keyMap[key] = 2
    	} else {
    		Notice("login ", key)
    		io.WriteString(w, fmt.Sprintf("<script> alert('登录失败') </script>"))
    	}
    
    }
    
    func checkLogin(w http.ResponseWriter, req *http.Request) {
    	key := req.FormValue("key")
    	if keyMap[key] == 2 {
    		Debug("checkLogin ok ", key)
    		io.WriteString(w, "1") // 登录成功
    	} else {
    		io.WriteString(w, "0")
    	}
    }
    


    这个东东弊端是 key 随处可见,只是用于 学习,用在商务的话 需要慎重!!!

    展开全文
  • 扫码登录实现原理

    万次阅读 2018-09-15 23:48:17
    今天说一说现在比较流行的扫码登录的实现原理。 需求介绍 首先,介绍下什么是扫码登录。现在,大部分同学手机上都装有qq和淘宝,天猫等这一类的软件。而开发这些app的企业,都有他们相对应的网站。为了让用户在...

    来源:http://www.cnblogs.com/liyasong/

    今天说一说现在比较流行的扫码登录的实现原理。

    需求介绍

    首先,介绍下什么是扫码登录。现在,大部分同学手机上都装有qq和淘宝,天猫等这一类的软件。而开发这些app的企业,都有他们相对应的网站。为了让用户在使用他们的网站时,登录更加方便和安全。这些企业提供了, 使用手机,扫一扫,就可以登录的服务。网页登录时的效果如下:

    有很多小伙伴可能会感到很神奇,网页上只是显示了个二维码,它怎么就知道是哪个手机扫到了二维码,并且进行登录的呢?而且,登录完成以后,还能直接把用户信息显示给用户,真的是很神奇啊。

    原理解释

    网页端+服务器

    接下来就是对于这个服务的详细实现。首先,大概说一下原理:用户打开网站的登录页面的时候,向浏览器的服务器发送获取登录二维码的请求。服务器收到请求后,随机生成一个uuid,将这个id作为key值存入redis服务器,同时设置一个过期时间,再过期后,用户登录二维码需要进行刷新重新获取。同时,将这个key值和本公司的验证字符串合在一起,通过二维码生成接口,生成一个二维码的图片(二维码生成,网上有很多现成的接口和源码,这里不再介绍。)然后,将二维码图片和uuid一起返回给用户浏览器。

    浏览器拿到二维码和uuid后,会每隔一秒向浏览器发送一次,登录是否成功的请求。请求中携带有uuid作为当前页面的标识符。这里有的同学就会奇怪了,服务器只存了个uuid在redis中作为key值,怎么会有用户的id信息呢? 

    这里确实会有用户的id信息,这个id信息是由手机服务器存入redis中的。具体操作如下:

    手机端+服务器

    话说,浏览器拿到二维码后,将二维码展示到网页上,并给用户一个提示:请掏出您的手机,打开扫一扫进行登录。用户拿出手机扫描二维码,就可以得到一个验证信息和一个uuid(扫描二维码获取字符串的功能在网上同样有很多demo,这里就不详细介绍了)。由于手机端已经进行过了登录,在访问手机端的服务器的时候,参数中都回携带一个用户的token,手机端服务器可以从中解析到用户的userId(这里从token中取值而不是手机端直接传userid是为了安全,直接传userid可能会被截获和修改,token是加密的,被修改的风险会小很多)。手机端将解析到的数据和用户token一起作为参数,向服务器发送验证登录请求(这里的服务器是手机服务器,手机端的服务器跟网页端服务器不是同一台服务器)。服务器收到请求后,首先对比参数中的验证信息,确定是否为用户登录请求接口。如果是,返回一个确认信息给手机端。

    手机端收到返回后,将登录确认框显示给用户(防止用户误操作,同时使登录更加人性化)。用户确认是进行的登录操作后,手机再次发送请求。服务器拿到uuId和userId后,将用户的userid作为value值存入redis中以uuid作为key的键值对中。

    登录成功

    然后,浏览器再次发送请求的时候,浏览器端的服务器就可以得到一个用户Id,并调用登录的方法,声成一个浏览器端的token,再浏览器再次发送请求的时候,将用户信息返回给浏览器,登录成功。这里存储用户id而不是直接存储用户信息是因为,手机端的用户信息,不一定是和浏览器端的用户信息完全一致。

    登录原理图如下:

    扩展阅读

    SSM框架原理,作用及使用方法

    单点登录原理与简单实现

    微博爬虫“免登录”技巧详解及 Java 实现

    微信公众号:javafirst

    扫码关注免费获取更多资源 

    展开全文
  • java实现简单扫码登录功能(模仿微信网页版扫码)

    万次阅读 多人点赞 2018-08-02 09:57:05
    #java实现简单扫码登录功能jsp+spring+struts2+mybatis:- **模仿微信pc网页版扫码登录** - **使用js代码生成*qrcode*二维码减轻服务器压力** - **js循环请求服务端,判断是否qrcode被扫** - **二维码超时失效功能** ...
  • 扫码登录成功后自动切换。 一、需要用到的库 本实例使用vue,二维码生成使用jquery-qrcode.js 二、index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> ...
  • 具体流程可以看微信官网的扫码登录文档 地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN 其实...
  • 二维码登录(三)扫码登录

    千次阅读 2018-06-13 17:11:58
    本文git地址:https://github.com/xvshu/qrlogin1,扫码登录页面此页面是模拟app登录页面,功能是扫到二维码后,自动跳转授权页面,授权成功,调用后台服务进行登录关系绑定 代码:&lt;%@ page ...
  • 扫码登陆的原理

    2020-10-20 09:35:11
    扫码登陆的实现需要手机端的服务器和Web端的服务器配合实现。大致分为以下几步: 「step1:网页端请求登陆二维码」 要实现网页版的扫码登陆,用户必须先要请求一个登陆的二维码。Web端的服务器收到用户申请登陆...
  • JAVA实现WEB端实现app扫码登录

    万次阅读 2020-05-19 19:59:54
    扫码登录: 我们经常用的一些app,如qq和淘宝,天猫等这一类的软件。而开发这些app的企业,都有他们相对应的网站。为了让用户在使用他们的网站时,登录更加方便和安全。企业提供了,使用手机,扫一扫,就可以登录的...
  • 本篇介绍的二维码登录不是微信开发平台的二维码登录,而是利用微信公众号临时二维码扫码事件关注公众号进行登录注册, 浏览器判断扫码状态有两种方式, 第一种是ajax每隔一秒进行轮询,如果用户扫码了则后台给个...
  • 微信扫码登录

    万次阅读 2017-10-11 13:14:04
    1、OAuth2.0  OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某... ...每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅
  • 微信扫码登录原理解析

    万次阅读 多人点赞 2017-12-17 11:52:36
    关于扫码登录的简单总结
  • 扫码登录

    2018-01-23 17:33:13
    3、二维码页面写一个js,自动请求服务器查询二维码是否被 4、服务器收到请求,查询,如果还没被,进入等待,先不返回结果 5、一旦被,立即返回结果,页面js收到响应,做后续处理 OK,步骤
  • .NET MVC 微信扫码登录

    2020-07-30 23:30:14
    .NET MVC 微信扫码登录,网站微信扫码登录,获取iconurl,openid,unionid,token等基本信息获取
  • C#实现微信扫码登录

    千次阅读 2019-07-14 12:25:12
    第一步:获取AppID AppSecret(去微信开放平台申请网址https://open.weixin.qq.com/) 第二步:生成扫描二维码,获取code https://open.weixin.qq.com/connect/qrconnect?appid=wx199283d1ab55f5af&...
  • QQ扫码登录实现与原理

    千次阅读 2019-05-31 11:37:04
    扫码原理 实现代码 工具类 1 import com.google.zxing.LuminanceSource; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; public cl...
  • websocket 扫码登录

    2019-07-30 17:41:16
    用户在扫码成功后,自动登录网页 过程解析 用户加载登录页面,JS自动生成unicode,并且两秒钟后自动发送给websocket服务器,将unicode存储在websocketSession中, 用户点击微信扫码按钮,将Unicode用作sceneId,...
  • 二维码扫码登录原理

    2020-06-14 20:01:16
    简要明了,步步深入,图文并茂地解析二维码扫码登录原理,让你在相同或相似的业务场景中安全可靠的实现二维码扫码登录
1 2 3 4 5 ... 20
收藏数 27,021
精华内容 10,808
关键字:

扫码登录