java实现二维码登录功能
本文采用Springboot工程进行开发,使用Google的zxing生成二维码,直接放代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.hcx</groupId>
<artifactId>spring-jdbc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-jdbc</name>
<description>spring-jdbc</description> <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<springfox.version>2.9.2</springfox.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
配置文件:
user:
qrcode:
expire-time: 100000
file-path: C:/Users/Administrator/Desktop/jar
file-type: PNG
height: 400
width: 400
controller代码:
package com.hcx.jdbc.qr; import java.io.IOException;
import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController; import com.google.zxing.WriterException; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; @RestController
@Slf4j
@Api("二维码服务")
public class QRCodeController { @Autowired
QRCodeService qrCodeService; @Autowired
QRCodeConfig qrCodeConfig; @PostMapping("/generator-qrcode")
@ApiOperation("生成二维码")
public String generatorQRCode(){
String baseUrl = "跳转页面";
String key = UUID.randomUUID().toString();
String path = null;
try {
path = qrCodeService.generateQRCodeImage(baseUrl,key);
QRCode qrCode = new QRCode();
long expireTime = qrCode.getCreateTime() + qrCodeConfig.getExpireTime();
qrCode.setExpireTime(expireTime);
QRCodeCache.getInstance().putQRCodeCache(key, qrCode);
return path;
} catch (WriterException e) {
log.info("生成二维码失败:" + e.getMessage());
return path;
} catch (IOException e) {
log.info("生成二维码失败:" + e.getMessage());
return path;
}
} @PostMapping("/generator-scan")
@ApiOperation("扫码二维码")
public String scanQRCode(String uuid){
QRCode qrCode = QRCodeCache.getInstance().getQRCodeCache(uuid);
if(null ==qrCode){
return "二维码已过期,请刷新获取";
}
if(qrCode.isScan()){
return "二维码扫码过,请刷新获取";
}
if(qrCode.getExpireTime() < System.currentTimeMillis()){
return "二维码已过期,请刷新获取";
}
qrCode.setScan(true);
return "登录页面";
} @PostMapping("/generator-hand")
@ApiOperation("处理二维码")
public String handQRCode(String uuid,String userName){
QRCode qrCode = QRCodeCache.getInstance().getQRCodeCache(uuid);
if(null ==qrCode){
return "二维码已过期,请刷新获取";
} if(qrCode.getExpireTime() < System.currentTimeMillis()){
return "二维码已过期,请刷新获取";
}
QRCodeCache.getInstance().removeQRCodeCache(uuid);
return "登录成功返回逻辑处理";
}
}
service代码:
package com.hcx.jdbc.qr; import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter; @Service
public class QRCodeService { @Autowired
QRCodeConfig qrCodeConfig; public String generateQRCodeImage(String basePath,String key) throws WriterException, IOException{
String text = basePath + "/" + key;
String path = qrCodeConfig.getFilePath() + File.separator + key +"." + qrCodeConfig.getFileType().toLowerCase(); QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, qrCodeConfig.getWidth(), qrCodeConfig.getHeight());
Path filePath = FileSystems.getDefault().getPath(path);
MatrixToImageWriter.writeToPath(bitMatrix, qrCodeConfig.getFileType(), filePath);
return path;
}
}
配置类:
package com.hcx.jdbc.qr; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration; import lombok.Data; @Configuration
@Data
@ConfigurationProperties(prefix="user.qrcode")
public class QRCodeConfig { private int width;
private int height;
private long expireTime;
private String filePath;
private String fileType;
}
持久代码:
package com.hcx.jdbc.qr; import java.util.HashMap;
import java.util.Map; public class QRCodeCache { public static Map<String, QRCode> cacheMap = new HashMap<String, QRCode>(); public static QRCodeCache instance = null; public static QRCodeCache getInstance() {
if(instance == null) {
instance = new QRCodeCache();
}
return instance;
} private QRCodeCache(){ } public void putQRCodeCache(String key,QRCode qrCode){
cacheMap.put(key, qrCode);
} public QRCode getQRCodeCache(String key){
return cacheMap.get(key);
} public void removeQRCodeCache(String key){
cacheMap.remove(key);
} }
二维码实体:
@Component
@Data
public class QRCode { private Long createTime = System.currentTimeMillis(); private Long expireTime; private boolean isScan = false;
}
java实现二维码登录功能的更多相关文章
- java实现扫二维码登录功能
哈哈哈 http://blog.sina.com.cn/s/blog_7f416edf0102vb8h.html http://blog.sina.com.cn/s/blog_7f416edf0102 ...
- node.js Websocket实现扫码二维码登录---GoEasy
最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...
- C(++) Websocket实现扫码二维码登录---GoEasy
最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...
- Python 实现扫码二维码登录
最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...
- Java二维码登录流程实现(包含短地址生成,含部分代码)
近年来,二维码的使用越来越风生水起,笔者最近手头也遇到了一个需要使用二维码扫码登录网站的活,所以研究了一下这一套机制,并用代码实现了整个流程,接下来就和大家聊聊二维码登录及的那些事儿. 二维码原理 二 ...
- 用c#开发微信 (20) 微信登录网站 - 扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 1 创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- Asp.Net微信登录-电脑版扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- C#微信登录-电脑版扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- java 生成二维码、可带LOGO、可去白边
1.准备工作 所需jar包: JDK 1.6: commons-codec-1.11.jar core-2.2.jar javase-2.2.jar JDK 1.7: commons-codec- ...
- Java实现二维码技术探讨。
Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.j ...
随机推荐
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-49-Route类拦截修改请求-下篇
1.简介 在日常工作和学习中,自动化测试的时候:在加载页面时,可能页面出现很多不是很重要或者不是我们所关注的,这个时候我们就可以选择不加载这些内容,以提高页面加载速度,节省资源.例如:可能页面上图片比 ...
- STM32WB55 BLE双核flash擦写程序深度解析
简介 STM32WB55的flash擦除有两种机制,一种是只有单核运行下的flash擦除,这种模式下,flash擦除的步骤同其他STM32的flash擦除一样,直接调用HAL库中flash擦除的库函数 ...
- NOIP模拟65
T1 网格图 解题思路 60pts 就是个zz做法..(我考场上造了一个 \(500\times 500\) 的 X,一看挺快,就以为 \(n^4\) 可以切,然而..) 正解有一点难度,对于每一个节 ...
- Vue简单自定义Canvas验证码组件。
在您的Vue项目中,是否曾遇到过需要增加验证码来增强账户安全性的情况?这个Vue通用Canvas验证码组件!采用Canvas,实现了高度自定义和灵活的验证码生成方式,让您的网站或应用轻松应对各类验证码 ...
- 副本集replicaSet
mongodb高可用架构 https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/ 复制是跨多个服务器同步数据的过程. 复制提供 ...
- springcloud之FeignClient访问微服务接口缓慢
springcloud之FeignClient访问微服务接口缓慢查询服务日志报错如下:Caused by: java.net.SocketTimeoutException: Read timed ou ...
- Spring之webMvc异常处理
异常处理可以前端处理,也可以后端处理. 从稳妥的角度出发,两边都应该进行处理. 本文专门阐述如何在服务端进行http请求异常处理. 一.常见的异常类型 当我们做http请求的时候,会有各种各样的可能错 ...
- 【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念
目录 前言 一.初识 RocketMQ 1.1基本模型 二.基本概念 2.1Producer 2.2Consumer 2.3Topic 2.4Tag 2.5Message 2.6Broker 2.7P ...
- 安卓Camera-HAL显示值与比例
安卓Camera-HAL显示值与比例 参考:https://blog.csdn.net/wang714818/article/details/78049649?utm_source=blogxgwz4 ...
- ZYNQ:使用SDK打包BOOT.BIN、烧录BOOT.BIN到QSPI-FLASH
打包程序为BOOT.BIN 注意,做好备份是一个好习惯. Vivado Vivado 添加QSPI Flash的IP,重新编译: Launch SDK(推荐方法):或者用SDK指定一个workspac ...