本文采用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. 面试题:两个UILabel横向排列,要求压缩其中一个Label,另外一个Label的内容保持完整

    一.题目 AutoLayout中,布局两个UILabel,竖直方向处于统一水平线上:水平方向,二者间隔一定距离,左边的label距离父容器一定间距,右边的label距离容器右侧一定间隔 要求,两个la ...

  2. ch58x/ch59xADC差分采样NTC电阻获取当前温度

    前言:之前的文章中也有关于使用I2C器件进行温度的采集的文章 采集温度的方式不止使用传感器,也可以使用NTC温敏电阻进行采集,此方法的外围电路较为简单切成本较低,代码也较为容易实现. 实现原理:先通过 ...

  3. Qt程序运行报错

    报错内容 PC环境为Ubuntu20.04,Qt版本是Qt5.12.9,AsensingViewer是编译好的程序 ./AsensingViewer: error while loading shar ...

  4. C++笔记(8)常规new运算符和定位new运算符

    通常,new负责在堆(heap)中找到一个能够满足要求的内存块.new运算符还有一种变体,被称为定位(placement)new运算符,他能让你能够指定要使用的位置.程序员可以使用这种特性来设置其内存 ...

  5. 一周万星的文本转语音开源项目「GitHub 热点速览」

    上周的热门开源项目让我想起了「图灵测试」,测试者在不知道对面是机器还是人类的前提下随意提问,最后根据对方回复的内容,判断与他们交谈的是人还是计算机.如果无法分辨出回答者是机器还是人类,则说明机器已通过 ...

  6. MySQL BETWEEN AND包含边界值

    select count(1) from table_a where my_date between '20230715' and '20230717'; 上面的SQL我们发现只统计了20230715 ...

  7. golang + postgresql + Kubernetes 后端学习

    记录 链接 dbdiagram 基于 Golang + PostgreSQL + Kubernetes 后端开发大师班[中英字幕]

  8. SDL3 入门(2):第一个窗口

    在上一篇文章中我们已经利用 SDL 的日志接口实现了简单的字符串输出,实际上是解决了开发环境搭建问题,接下来我们将在已有代码的基础上继续开发,实现第一个窗口的创建和背景色绘制. 初始化 首先设置日志输 ...

  9. es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo

    #创建索引songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "i ...

  10. SoftReference 到底在什么时候被回收 ? 如何量化内存不足 ?

    本文基于 OpenJDK17 进行讨论,垃圾回收器为 ZGC. 提示: 为了方便大家索引,特将在上篇文章 <以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的> 中讨 ...