广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java Spring Boot实现简易扫码登录详解
  • 811
分享到

Java Spring Boot实现简易扫码登录详解

2024-04-02 19:04:59 811人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言项目简介实现思路实现步骤1.用户访问网页端,选择扫码登录2.使用手机扫码,二维码状态改变3.手机确认登录效果演示总结前言 本文将介绍基于SpringBoot + Vue +

前言

本文将介绍基于SpringBoot + Vue + Android实现的扫码登录demo的总体思路,完整代码已上传到GitHubWEB端体验地址:Http://47.116.72.33/(只剩一个月有效期),apk下载地址:https://github.com/Zjvngvn/qrscan/releases/tag/0.0.1。用户名:非空即可,密码:123456,效果见文末,整体实现如有不妥之处,欢迎交流讨论,实现部分参考二维码扫码登录是什么原理。

项目简介

后端springBoot,Redis

前端Vue,Vue Router、VueX、AxiOS、vue-qr、ElemntUI。

安卓:ZXing、XUI、YHttp。

实现思路

总体的扫码登录和OAuth2.0的验证逻辑相似,如下所示:

image-20210921205657426

用户选择扫码登录可以看作是A:前端发授权请求,等待app扫码。

用户使用app进行扫码可以看作是B:扫码进行授权,返回一个临时Token供二次认证。

用户在app进行确认登录可以看作是C:进行登录确认,授权用户在Web端登录。

后端在用户确认登录后返回一个正式Token即可看作是步骤D。

后续前端根据正式Token访问后台接口,正式在Web端进行操作即可看作是E和F。

二次认证的原因

之所以在用户扫码之后还需要进行再一次的确认登录,而不是直接就登录的原因,则是为了用户安全考虑,避免用户扫了其他人需要登录的二维码,在未经确认就直接登录了,导致他人可能会在我们不知道的情况下访问我们的信息。

实现步骤

1.用户访问网页端,选择扫码登录

用户在选择扫码登录时,会向后端发送一个二维码的生成请求,后端生成UUID,并保存到Redis(固定有效时间),状态设置为UNUSED(未使用)状态,如果Redis缓存过期,则为EXPIRE(过期)状态,前端根据后端返回的内容生成二维码,并设置一个定时器,每隔一段时间根据二维码的内容中的UUID,向后端发送请求,获取二维码的状态,更新界面展示的内容。

生成二维码后端接口:



@GetMapping("/generate")
public BaseResult generate() {
    String code = IdUtil.simpleUUID();
    redisCache.setCacheObject(code, CodeUtils.getUnusedCodeInfo(), 
                              DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS);
    return BaseResult.success(GENERATE_SUCCESS, code);
}

前端获取内容,生成二维码:


getToken() {
    this.codeStatus = 'EMPTY'
    this.tip = '正在获取登录码,请稍等'
    // 有效时间 60 秒
    this.effectiveSeconds = 60
    clearInterval(this.timer)
    request({
        method: 'get',
        url: '/code/generate'
    }).then((response) => {
        // 请求成功, 设置二维码内容, 并更新相关信息
        this.code = `${HOST}/code/scan?code=${response.data}`
        this.codeStatus = 'UNUSED'
        this.tip = '请使用手机扫码登录'
        this.timer = setInterval(this.getTokenInfo, 2000)
    }).catch(() => {
        this.getToken()
    })
}

后端返回二维码状态信息的接口:



@GetMapping("/info")
public BaseResult info(String code) {
    CodeVO codeVO = redisCache.getCacheObject(code);
    if (codeVO == null) {
        return BaseResult.success(INVALID_CODE, StringUtils.EMPTY);
    }
    return BaseResult.success(GET_SUCCESS, codeVO);
}

前端轮询获取二维码状态:


getTokenInfo() {
    this.effectiveSeconds--
    // 二维码过期
    if (this.effectiveSeconds <= 0) {
        this.codeStatus = 'EXPIRE'
        this.tip = '二维码已过期,请刷新'
        return
    }
    // 轮询查询二维码状态
    request({
        method: 'get',
        url: '/code/info',
        params: {
            code: this.code.substr(this.code.indexOf('=') + 1)
        }
    }).then(response => {
        const codeVO = response.data
        // 二维码过期
        if (!codeVO || !codeVO.codeStatus) {
            this.codeStatus = 'EXPIRE'
            this.tip = '二维码已过期,请刷新'
            return
        }
        // 二维码状态为为正在登录
        if (codeVO.codeStatus === 'CONFIRMING') {
            this.username = codeVO.username
            this.avatar = codeVO.avatar
            this.codeStatus = 'CONFIRMING'
            this.tip = '扫码成功,请在手机上确认'
            return
        }
        // 二维码状态为确认登录
        if (codeVO.codeStatus === 'CONFIRMED') {
            clearInterval(this.timer)
            const token = codeVO.token
            store.commit('setToken', token)
            this.$router.push('/home')
            Message.success('登录成功')
            return
        }
    })
}

2.使用手机扫码,二维码状态改变

当用户使用手机扫码时(已登录并且为正确的app,否则扫码会跳转到自定义的宣传页),会更新二维码的状态为CONFIRMING(待确认)状态,并在Redis缓存中新增用户名及头像信息的保存供前端使用展示,此外还会返回用户的登录信息(登录地址、浏览器、操作系统)给app展示,同时生成一个临时Token给app(固定有效时间)。

用户扫码时的后台处理:



private BaseResult handleUnusedQr(String code, String token) {
    // 校验 app 端访问传递的 token
    boolean isLegal = JwtUtils.verify(token);
    if (!isLegal) {
        return BaseResult.error(AUTHENTICATioN_FaiLED);
    }
    // 保存用户名、头像信息, 供前端展示
    String username = JwtUtils.getUsername(token);
    CodeVO codeVO = CodeUtils.getConfirminGCodeInfo(username, DEFAULT_AVATAR_URL);
    redisCache.setCacheObject(code, codeVO, DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS);
    // 返回登录地址、浏览器、操作系统以及一个临时 token 给 app
    String address = HttpUtils.getRealAddressByIp();
    String browser = HttpUtils.getBrowserName();
    String os = HttpUtils.getOsName();
    String tmpToken = JwtUtils.sign(username);
    // 将临时 token 作为键, 用户名为内容存储在 redis 中
    redisCache.setCacheObject(tmpToken, username, DEFAULT_TEMP_TOKEN_EXPIRE_MINUTES, TimeUnit.MINUTES);
    LoginInfoVO loginInfoVO = new LoginInfoVO(address, browser, os, tmpToken);
    return BaseResult.success(SCAN_SUCCESS, loginInfoVO);
}

3.手机确认登录

当用户在app中点击确认登录时,就会携带生成的临时Token发送更新状态的请求,二维码的状态会被更新为CONFIRMED(已确认登录)状态,同时后端会生成一个正式Token保存在Redis中,前端在轮询更新状态时获取这个Token,然后使用这个Token进行登录。

后端处理确认登录的代码:



private BaseResult handleConfirmingQr(String code, String token) {
    // 使用临时 token 获取用户名, 并从 redis 中删除临时 token
    String username = redisCache.getCacheObject(token);
    if (StringUtils.isBlank(username)) {
        return BaseResult.error(AUTHENTICATION_FAILED);
    }
    redisCache.deleteObject(token);
    // 根据用户名生成正式 token并保存在 redis 中供前端使用
    String fORMalToken = JwtUtils.sign(username);
    CodeVO codeVO = CodeUtils.getConfirmedCodeInfo(username, DEFAULT_AVATAR_URL, formalToken);
    redisCache.setCacheObject(code, codeVO, DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS);
    return BaseResult.success(CONFIRM_SUCCESS);
}

效果演示

在这里插入图片描述

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: Java Spring Boot实现简易扫码登录详解

本文链接: https://www.lsjlt.com/news/136691.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java Spring Boot实现简易扫码登录详解
    目录前言项目简介实现思路实现步骤1.用户访问网页端,选择扫码登录2.使用手机扫码,二维码状态改变3.手机确认登录效果演示总结前言 本文将介绍基于SpringBoot + Vue + ...
    99+
    2022-11-12
  • Spring Boot怎么实现微信扫码登录功能
    本文小编为大家详细介绍“Spring Boot怎么实现微信扫码登录功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot怎么实现微信扫码登录功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • Spring Boot实现微信扫码登录功能流程分析
    目录1. 授权流程说明第一步:请求CODE第二步:通过code获取access_token第三步:通过access_token调用接口2. 授权流程代码3. 用户登录和登出4. Sp...
    99+
    2022-11-13
  • Spring Boot实现登录验证码功能的案例详解
    目录验证码的作用案例要求前端页面准备准备login.html页面随机验证码工具类后端控制器验证码的作用 验证码的作用:可以有效防止其他人对某一个特定的注册用户用特定的程序暴力破解方式...
    99+
    2022-11-13
    springboot登录验证码 springboot验证码
  • springboot扫码登录的简单实现
    目录前言项目简介实现思路实现步骤前言 本文将介绍基于SpringBoot + Vue + Android实现的扫码登录demo的总体思路,完整代码已上传到GitHub。Web端体验地...
    99+
    2022-11-12
  • Java实现微信扫码登录
    微信扫码登录 1. 授权流程说明第一步:请求 code第二步:通过 code 获取 access_token第三步:通过 access_token 调用接口 2. 授权流程代码3...
    99+
    2023-09-01
    微信 java
  • 实例详解Spring Boot实战之Redis缓存登录验证码
    本章简单介绍redis的配置及使用方法,本文示例代码在前面代码的基础上进行修改添加,实现了使用redis进行缓存验证码,以及校验验证码的过程。1、添加依赖库(添加redis库,以及第三方的验证码库) <dependency...
    99+
    2023-05-31
    spring boot redis
  • C语言实现简易扫雷游戏详解
    本文实例为大家分享了C语言实现简易扫雷游戏的具体代码,供大家参考,具体内容如下 一、想要达到的游戏功能: 大家如果想编写一个游戏,应具备以下的步骤: 1:了解游戏的规则 2:&nbs...
    99+
    2022-11-12
  • 基于Java怎么实现扫码登录
    这篇文章主要介绍了基于Java怎么实现扫码登录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Java怎么实现扫码登录文章都会有所收获,下面我们一起来看看吧。原理解析1. 身份认证机制在介绍扫码登录的原理之前...
    99+
    2023-06-30
  • 详解Spring Boot实现日志记录 SLF4J
    在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了。 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增加资源的消耗。 而Log4j 更为灵活在...
    99+
    2023-05-31
    spring boot slf4j
  • 详解Vue PC端如何实现扫码登录功能
    本篇文章给大家带来了关于Vue的相关知识,其中主要介绍了在PC端实现扫码的原理是什么?怎么生成二维码图片?怎么用Vue实现前端扫码登录?感兴趣的朋友,下面一起来看一下吧,希望对大家有帮助。.markdown-body{word-break:...
    99+
    2023-05-14
    前端 Vue.js
  • Spring Security实现用户名密码登录详解
    目录环境用户名密码登录E-R图POM依赖配置文件MapperService设计HTMLController启动完整代码环境 JDK 1.8 Spring Boot 2.3.0.REL...
    99+
    2022-11-13
    Spring Security用户名密码登录 Spring Security 密码登录 Spring Security 登录
  • 基于Java实现扫码登录的示例代码
    目录基本介绍原理解析1. 身份认证机制2. 流程概述代码实现1. 环境准备2. 主要依赖3. 生成二维码4. 扫描二维码5. 确认登录6. PC 端轮询7. 拦截器配置效果演示1. ...
    99+
    2022-11-13
  • JAVA Spring Boot 自动配置实现原理详解
    目录引言主启动类的注解@SpringBootApplication1、@SpringBootConfiguration2、@ComponentScan3、@EnableAutoCon...
    99+
    2022-11-12
  • Web端扫码登录的原理和实现讲解
    1 概述 在日常 Web 端产品的使用中,一般都会支持扫码登录,这种方式操作简单,相对传统的手机号登录等方式速度更快、安全性更高,还可以增加自家产品的粘合度。 2 登录原理 扫码登录...
    99+
    2023-03-23
    Web扫码登录 扫码登录原理 扫码登录实现
  • java编程之基于SpringBoot框架实现扫码登录
    目录项目简介实现思路二次认证的原因实现步骤用户访问网页端,选择扫码登录使用手机扫码,二维码状态改变手机确认登录效果演示完整代码已上传到GitHub。 Web端体验地址:http://...
    99+
    2022-11-12
  • C++简易通讯录系统实现流程详解
    目录实现功能定义通讯录和通讯录人员结构体实现通讯录输入菜单1.定义菜单函数:2.主函数循环体中循环展示菜单信息实现增删改查和清空通讯录功能运行截图展示实现功能 提示:这里可以添加本文...
    99+
    2022-11-13
  • Java实现简易拼图游戏的方法详解
    目录效果展示游戏结构实现代码效果展示 介绍:游戏共有五张图片可以选择,分成了4 X 4 十六个方格,点击开始就可以开始游戏。游戏运行的截图如下: 游戏结构 实现代码 代码如下:M...
    99+
    2022-11-13
  • Java实现扫雷游戏详细代码讲解
    目录效果展示难度选择展示游戏界面展示代码展示主类:GameWin类底层地图MapBottom类顶层地图MapTop类底层数字BottomNum类初始化地雷BottomRay类工具Ga...
    99+
    2022-11-13
  • Android本地验证码的简易实现方法(防止暴力登录)
    0.  前言  验证码无处不在,有人问我,你知道达芬奇密码下面是什么吗,对,答案就是达芬奇验证码。 验证码一个最主要的作用就是防止恶意暴力破解登录,防止不间...
    99+
    2022-06-06
    方法 验证码 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作