本文采用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实现二维码登录功能的更多相关文章

  1. java实现扫二维码登录功能

    哈哈哈 http://blog.sina.com.cn/s/blog_7f416edf0102vb8h.html http://blog.sina.com.cn/s/blog_7f416edf0102 ...

  2. node.js Websocket实现扫码二维码登录---GoEasy

    最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...

  3. C(++) Websocket实现扫码二维码登录---GoEasy

    最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...

  4. Python 实现扫码二维码登录

    最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...

  5. Java二维码登录流程实现(包含短地址生成,含部分代码)

    近年来,二维码的使用越来越风生水起,笔者最近手头也遇到了一个需要使用二维码扫码登录网站的活,所以研究了一下这一套机制,并用代码实现了整个流程,接下来就和大家聊聊二维码登录及的那些事儿. 二维码原理 二 ...

  6. 用c#开发微信 (20) 微信登录网站 - 扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 1 创建网站应用 在微信开放平台创建一个网站应用 https:// ...

  7. Asp.Net微信登录-电脑版扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...

  8. C#微信登录-电脑版扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...

  9. 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- ...

  10. Java实现二维码技术探讨。

    Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码  http://swetake.com/qr/ 下载地址  或着http://sourceforge.j ...

随机推荐

  1. 《最新出炉》系列入门篇-Python+Playwright自动化测试-49-Route类拦截修改请求-下篇

    1.简介 在日常工作和学习中,自动化测试的时候:在加载页面时,可能页面出现很多不是很重要或者不是我们所关注的,这个时候我们就可以选择不加载这些内容,以提高页面加载速度,节省资源.例如:可能页面上图片比 ...

  2. STM32WB55 BLE双核flash擦写程序深度解析

    简介 STM32WB55的flash擦除有两种机制,一种是只有单核运行下的flash擦除,这种模式下,flash擦除的步骤同其他STM32的flash擦除一样,直接调用HAL库中flash擦除的库函数 ...

  3. NOIP模拟65

    T1 网格图 解题思路 60pts 就是个zz做法..(我考场上造了一个 \(500\times 500\) 的 X,一看挺快,就以为 \(n^4\) 可以切,然而..) 正解有一点难度,对于每一个节 ...

  4. Vue简单自定义Canvas验证码组件。

    在您的Vue项目中,是否曾遇到过需要增加验证码来增强账户安全性的情况?这个Vue通用Canvas验证码组件!采用Canvas,实现了高度自定义和灵活的验证码生成方式,让您的网站或应用轻松应对各类验证码 ...

  5. 副本集replicaSet

    mongodb高可用架构 https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/ 复制是跨多个服务器同步数据的过程. 复制提供 ...

  6. springcloud之FeignClient访问微服务接口缓慢

    springcloud之FeignClient访问微服务接口缓慢查询服务日志报错如下:Caused by: java.net.SocketTimeoutException: Read timed ou ...

  7. Spring之webMvc异常处理

    异常处理可以前端处理,也可以后端处理. 从稳妥的角度出发,两边都应该进行处理. 本文专门阐述如何在服务端进行http请求异常处理. 一.常见的异常类型 当我们做http请求的时候,会有各种各样的可能错 ...

  8. 【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念

    目录 前言 一.初识 RocketMQ 1.1基本模型 二.基本概念 2.1Producer 2.2Consumer 2.3Topic 2.4Tag 2.5Message 2.6Broker 2.7P ...

  9. 安卓Camera-HAL显示值与比例

    安卓Camera-HAL显示值与比例 参考:https://blog.csdn.net/wang714818/article/details/78049649?utm_source=blogxgwz4 ...

  10. ZYNQ:使用SDK打包BOOT.BIN、烧录BOOT.BIN到QSPI-FLASH

    打包程序为BOOT.BIN 注意,做好备份是一个好习惯. Vivado Vivado 添加QSPI Flash的IP,重新编译: Launch SDK(推荐方法):或者用SDK指定一个workspac ...