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 ...
随机推荐
- 鸿蒙HarmonyOS实战-Web组件(基本使用和属性)
前言 Web是一种基于互联网的技术和资源的网络服务系统.它是指由许多互连的计算机组成的全球性计算机网络,使用户能够通过浏览器访问和交互式使用各种信息和资源,如网页.文档.图片.视频.音频等.通过Web ...
- TensorRT环境配置(VS+opencv4.5)
1 TensorRT下载 下载与TensorRT相匹配的CUDA和cuDNN版本:https://docs.nvidia.com/deeplearning/tensorrt/archives/tens ...
- 开源一站式敏捷测试管理平台 itest(爱测试) 6.6.1 发布,安全升级及新增强
(一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行 ...
- ansible搭建
ansible配置步骤 1.创建用户 2.用户提权 3.用户免密 4.cp ansible配置文件 5.配置主机清单 6.修改ansible 用户路径下的配置文件 1.创建用户(都要做) [root@ ...
- js字符串类型
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 推荐一款免费的终端工具-Windterm
Windterm 提到SSH终端工具,大家一定会想到putty.xshell.MobaXterm这些产品.但是当我使用Windterm后,我彻底改变了我对之前使用SSH终端工具的认知,其强大的能力,彻 ...
- Linux扩展篇-shell编程(十一)- shell编程工具-VS Code
根据个人多年工作经验,shell没有自己专用的IDE,使用vim开发,对于新手而言不太友好,那如何高效快速书写shell脚本?合适的工具就显得尤为重要,本人比较推荐的就是VS Code.里面有比较成熟 ...
- SpringBoot系列(三)元注解
元注解,注解的注解,SpringBoot有四个元注解,分别是@Target.@Retention.@Documented.@Inherited.下面就是对元注解的详细讲解和源码展示. @Taget 该 ...
- C#中路径说明
路径中一个点和两个点的区别 ./ 表示当前目录,如"./jquery-1.3.2.min.js",也可以去掉"./",如"jquery-1.3. ...
- skywalking需要引入的背景(查询调用链),传统的日志查询方法, 引入EFK日志搜索重要性
1.根据两次请求日志的关键点来截取日志,缩小日志的范围.tail -f orderApi.log | grep "orderKeyWordSubmit" 确定两次异常请求的 ...