微博扫码登录原理及实现

原理

流程图
  1. 点击扫码登录时,向服务器发送请求,生成qrid和image地址。并开启轮询

    第一步
  2. 向服务持续请求,大概2s一次,返回二维码状态

    第二步
    • 未使用。
    • 二维码已扫描,请客户端确定。
    • 二维码已失效。 会调用第一步重新生成二维码图片
  3. 如果二维码图片关闭,轮询也会关闭。减少服务器请求

实现

大概也只有三步,因为ajax禁止了跨域请求,只能在java后端实现。

  1. 获取图片地址,并返回前端,用于页面展示。
    @GetMapping("/getimg")
    @ResponseBody
    public String getimg() throws IOException {

        String url = "https://login.sina.com.cn/sso/qrcode/image?entry=weibo&size=180&callback=STK_" + System.currentTimeMillis();
        String body = Jsoup.connect(url).ignoreContentType(true).execute().body();
        JSONObject jsonObject = JSONObject.parseObject(StringUtils.substringBetween(body, "(", ")"));

        imageurl = jsonObject.getJSONObject("data").getString("image");
        qrid = jsonObject.getJSONObject("data").getString("qrid");
        String data = "https://v2." + imageurl.substring(2, imageurl.length());
        System.out.println(data);
        return data;
    }
  1. 校验二维码状态。
    @GetMapping("/check")
    @ResponseBody
    public String check(HttpSession session) throws IOException, InterruptedException {

        String url = "https://login.sina.com.cn/sso/qrcode/check?entry=weibo&qrid=" + qrid + "&callback=STK_" + System.currentTimeMillis();
        String body = Jsoup.connect(url).ignoreContentType(true).execute().body();
        System.out.println(body);
        JSONObject jsonObject = JSONObject.parseObject(StringUtils.substringBetween(body, "(", ")"));
        if ("20000000".equals(jsonObject.getString("retcode"))) {
            //执行登录操作
        }
        return jsonObject.getString("retcode");
    }

  1. 前端ajax调用。
   $("#login").click(function () {
        $.get("/getimg", function (data) {
            $("#login_image").attr("src", data);
        });
        $(".ui.page.dimmer").dimmer('show');
        var timer1 = setInterval(checkScan, 2500);//每隔3s执行一次checkScan
        function checkScan() {
            $(".ui.page.dimmer").dimmer({
                onHide: function () {
                    clearInterval(timer1);
                }
            });
            $.get("/check", function (data) {
                if (data == "50114001") {
                }
                if (data == "50114002") {
                    $('#login_msg').html("已经扫描,请在客户端确认");//将二维码取消,防止其他人再扫
                }
                if (data == "50114015") {
                    $.get("/getimg", function (data) {
                        $("#login_image").attr("src", data);
                    });
                }
                if (data == "50114003") {
                    $.get("/getimg", function (data) {
                        $("#login_image").attr("src", data);
                    });
                }
                if (data == "20000000") {
                    clearInterval(timer1);
                    window.location.href = "/";
                }
            });
        }
    });

效果

演示地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,795评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,286评论 19 139
  • 由于做旅行社的工作,我会和各种各样的客户打交道,而且很多都以夫妻为主,有刚结婚的蜜月夫妻,有已经有孩子的夫妻,还有...
    快乐的嫣红阅读 364评论 13 9
  • 弗兰克瘫倒在地上,呆呆的望着外面狂斥着愤怒的雪朵。“这该死的天气!”他无意识骂道,“我第一天来到这儿,还是晴空万里...
    千嬴千离阅读 313评论 0 0