Spring Boot整合zxing实现二维码登录

zxing是google的一个二维码生成库,使用时需配置依赖:

implementation("com.google.zxing:core:3.4.1")
implementation("com.google.zxing:javase:3.4.1")

zxing的基本使用

我们可以通过MultiFormatWriter().encode()方法获取一个matrix对象:

val matrix = MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hint)

这个方法接受5个参数,按照顺序解释如下:

  1. 二维码的字符串内容
  2. 格式,如要生成二维码,则需传入BarcodeFormat.QR_CODE
  3. 二维码宽度(像素)
  4. 二维码高度(像素)
  5. 二维码的属性

其中,第5个参数需要传入一个HashMap对象:

private val hint = mapOf(// 误差校正等级EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.M,// 字符集EncodeHintType.CHARACTER_SET to "UTF-8",// 外边框像素EncodeHintType.MARGIN to 5
)

需要指定三个键,第一个键的值是误差校正等级,在ErrorCorrectionLevel枚举中,有如下选择:

  • L:可以校正7%
  • M:可以校正15%
  • Q:可以校正25%
  • H:可以校正30%

误差校正等级的存在,可以使二维码被遮挡时,仍然能够被正常扫描。一般来说,误差校正等级越大,二维码就越大

第二个键是字符集,一般用UTF-8即可

第三个键是外边框的像素大小

整合Spring Boot

首先我们需要有一个二维码生成的工具类,可以生成将二维码并将二维码输出至一个输出流:

package com.example.qrcode.utilimport com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.MultiFormatWriter
import com.google.zxing.client.j2se.MatrixToImageWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import java.io.OutputStreamobject QRUtil {private val width = 400private val height = 400private val hint = mapOf(// 误差校正等级EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.M,// 字符集EncodeHintType.CHARACTER_SET to "UTF-8",// 外边框像素EncodeHintType.MARGIN to 5)/*** 创建二维码并写入到输出流* @param content 二维码内容* @param outputStream 输出流* */fun writeCodeIntoStream(content: String, outputStream: OutputStream){val matrix = MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hint)MatrixToImageWriter.writeToStream(matrix, "png", outputStream)}}

接下来我们需要一个控制器类,提供电脑生成二维码的登录接口,手机扫描二维码使设备登录的接口,和手机扫描二维码后,电脑登陆成功,跳转的接口:

package com.example.qrcode.controllerimport com.example.qrcode.util.QRUtil
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import jakarta.servlet.http.HttpSession
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import java.net.URL@RestController
class QRLoginController {val idLogin = HashMap<String, Boolean>()@RequestMapping("/QR/login")fun login(request: HttpServletRequest, response: HttpServletResponse, session: HttpSession){if (idLogin.containsKey(session.id) && idLogin[session.id] == true){response.sendRedirect("/QR/login/down")return}response.setIntHeader("Refresh", 1)val strUrl = request.requestURL.toString()val url = URL(strUrl)val host = url.hostval pro = url.protocolQRUtil.writeCodeIntoStream("$pro://$host/QR/login/${session.id}", response.outputStream)}@RequestMapping("/QR/login/{id}")fun loginByID(@PathVariable("id") id: String): String{idLogin[id] = truereturn "登录中"}@RequestMapping("/QR/login/down")fun loginDown(): String{return "登录成功"}}

在/QR/login接口中,我们首先判断当前会话是否已经被人扫了二维码,如果是,则重定向到/QR/login/down接口中;而如果不是,则会通过设置响应头"Refresh"参数,使电脑浏览器端每个一秒刷新一下,并向电脑输出一个二维码,手机扫描这个二维码后,将会前往/QR/login/{id}接口,并通过可变的URL路径,将id传入。

在/QR/login/{id}接口中,将会将传入的id的登录状态设置为真。这样的话,电脑端访问的/QR/login接口就会跳转至/QR/login/down接口

要注意,这里面的实现方式不是正常的实现方式。正常的实现方式应通过前端的脚本语言实现登录状态的刷新。但是因为我们没有前端,所以采用了这种方法

由于手机扫描二维码时,不会指定访问端口,因此需要在application.properties中,配置服务器的端口:

server.port=80

测试一下

使用浏览器访问http://[你的IP地址]/QR/login,注意,这里不能通过127.0.0.1或localhost访问,因为需要手机和电脑两个设备访问

这时,浏览器会显示一个二维码(CSDN可能不让上传二维码,因此进行了手动打码):

接下来使用手机扫描这个二维码,会发现浏览器成功的跳转到了登录成功的页面:

 因此,我们的二维码登录就成功实现了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/272672.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS顶部与JS后写:网页渲染的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

惬意上手MySQL

大家好&#xff0c;我又来写博客了&#xff0c;今天给大家介绍一下MySQL,如果你只想让MySQL作为自己的辅助开发工具&#xff0c;那这一篇文章就够了&#xff0c;如果想作为一门语言来学习&#xff0c;那你可以看此文章了解一些基础。 MySQL介绍 数据库可分为关系型数据库和非关…

时间序列-AR MA ARIMA

一、AR模型(自回归) AR探索趋势和周期性 预测依赖于过去的观测值和模型中的参数。模型的阶数 p pp 决定了需要考虑多少个过去时间点的观测值。 求AR模型的阶数 p和参数 ϕ i \phi_i ϕi​ &#xff0c;常常会使用统计方法如最小二乘法、信息准则&#xff08;如AIC、BIC&#xf…

【牛客】VL69 脉冲同步器(快到慢)

描述 sig_a 是 clka&#xff08;300M&#xff09;时钟域的一个单时钟脉冲信号&#xff08;高电平持续一个时钟clka周期&#xff09;&#xff0c;请设计脉冲同步电路&#xff0c;将sig_a信号同步到时钟域 clkb&#xff08;100M&#xff09;中&#xff0c;产生sig_b单时钟脉冲信号…

SpringMVC07、整合SSM

7、整合SSM 7.1、环境要求 环境&#xff1a; IDEAMySQL 5.7.19Tomcat 9 Maven 3.6 要求&#xff1a; 需要熟练掌握MySQL数据库&#xff0c;Spring&#xff0c;JavaWeb及MyBatis知识&#xff0c;简单的前端知识&#xff1b; 7.2、数据库环境 创建一个存放书籍数据的数据库…

文本生成视频:从 Write-a-video到 Sora

2024年2月15日&#xff0c;OpenAI 推出了其最新的文本生成视频模型——Sora。Sora 能够根据用户的指令生成一分钟长度的高质量视频内容。这一创新的发布迅速在社会各界引发了广泛关注与深入讨论。本文将围绕本实验室发表于SIGGRAPH AISA 的 Write-a-video和 Sora 展开&#xff…

anaconda和pycharm安装(windows10 )

1、anaconda安装 anaconda是一个软件发行版。软件发行版是一个预先建立和配置好的packages的集合&#xff0c;可以被安装在操作系统上&#xff0c;并被使用。Anaconda是由Anaconda公司开发的&#xff0c;一个包含PyData生态中的核心软件的完全发行版&#xff0c;它包含了Python…

LC打怪录 数组array

数组&#xff08;Array&#xff09; definition: 一种线性表数据结构。它使用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 如上图所示&#xff0c;假设数据元素的个数为 nnn&#xff0c;则数组中的每一个数据元素都有自己的下标索引&#xff0c;下标索引从…

基于机器学习的工业用电量预测完整代码数据

视频讲解: 毕业设计:算法+系统基于机器学习的工业用电量预测完整代码数据_哔哩哔哩_bilibili 界面展示: 结果分析与展示: 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing…

超网、IP 聚合、IP 汇总分别是什么?三者有啥区别和联系?

一、超网 超网&#xff08;Supernet&#xff09;是一种网络地址聚合技术&#xff0c;它可以将多个连续的网络地址合并成一个更大的网络地址&#xff0c;从而减少路由表的数量和大小。超网技术可以将多个相邻的网络地址归并成一个更大的网络地址&#xff0c;这个更大的网络地址…

从零开始:神经网络(1)——神经元和梯度下降

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 一. 神经网络 1. 神经网络的发展 先了解一下神经网络发展的历程。从单层神经网络&#xff08;感知器&#xff09;开…

excel统计分析——嵌套设计

参考资料&#xff1a;生物统计学&#xff0c;巢式嵌套设计的方差分析 嵌套设计&#xff08;nested design&#xff09;也称为系统分组设计或巢式设计&#xff0c;是把试验空间逐级向低层次划分的试验设计方法。与裂区设计相似&#xff0c;先按一级因素设计试验&#xff0c;然后…

高度塌陷问题及解决

什么情况下产生 (when 父盒子没有定义高度&#xff0c;但是子元素有高度&#xff0c;希望用子盒子撑起父盒子的高度&#xff0c;但是子盒子添加了浮动属性之后&#xff0c;父盒子高度为0 <template><div class"father"><div class"son"&…

R统计学2 - 数据分析入门问题21-40

往期R统计学文章&#xff1a; R统计学1 - 基础操作入门问题1-20 21. 如何对矩阵按行 (列) 作计算&#xff1f; 使用函数 apply() vec 1:20 # 转换为矩阵 mat matrix (vec , ncol4) # [,1] [,2] [,3] [,4] # [1,] 1 6 11 16 # [2,] 2 7 12 17 # [3,] …

了解华为(PVID VLAN)与思科的(Native VLAN)本征VLAN的区别并学习思科网络中二层交换机的三层结构局域网VLAN配置

一、什么是二层交换机&#xff1f; 二层交换机&#xff08;Layer 2 Switch&#xff09;是一种网络设备&#xff0c;主要工作在OSI模型的数据链路层&#xff08;第二层&#xff09;&#xff0c;用于在局域网内部进行数据包的交换和转发。二层交换机通过学习MAC地址表&#xff0…

codeforcesABC

A A. Marathon time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output DeepL 翻译  A.马拉松 每次测试的时间限制&#xff1a;1 秒 每次测试的内存限制&#xff1a;256 兆字节 输入&#xff1a…

简单认识Linux

今天带大家简单认识一下Linux&#xff0c;它和我们日常用的Windows有什么不同呢&#xff1f; Linux介绍 Linux内核&发行版 Linux内核版本 内核(kernel)是系统的心脏&#xff0c;是运行程序和管理像磁盘和打印机等硬件设备的核心程序&#xff0c;它提供了一个在裸设备与…

Nginx配置文件的整体结构

一、Nginx配置文件的整体结构 从图中可以看出主要包含以下几大部分内容&#xff1a; 1. 全局块 该部分配置主要影响Nginx全局&#xff0c;通常包括下面几个部分&#xff1a; 配置运行Nginx服务器用户&#xff08;组&#xff09; worker process数 Nginx进程PID存放路径 错误…

Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解

1.Normalizer&#xff08;归一化&#xff09;&#xff08;更加推荐使用&#xff09; 优点&#xff1a;将每个样本向量的欧几里德长度缩放为1&#xff0c;适用于计算样本之间的相似性。 缺点&#xff1a;只对每个样本的特征进行缩放&#xff0c;不保留原始数据的分布形状。 公式…

【ubuntu】安装 Anaconda3

目录 一、Anaconda 说明 二、操作记录 2.1 下载安装包 2.1.1 官网下载 2.1.2 镜像下载 2.2 安装 2.2.1 安装必要的依赖包 2.2.2 正式安装 2.2.3 检测是否安装成功 方法一 方法二 方法三 2.3 其他 三、参考资料 3.1 安装资料 3.2 验证是否成功的资料 四、其他 …