我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何基于SpringBoot生成二维码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何基于SpringBoot生成二维码

这篇文章给大家分享的是有关如何基于SpringBoot生成二维码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、基于Google开发工具包ZXing生成二维码

(1)首先,需要在pom.xml依赖配置文件中加入该工具包的依赖Jar,如下所示:   

<!-- zxing生成二维码 --><dependency>    <groupId>com.google.zxing</groupId>    <artifactId>core</artifactId>    <version>3.3.3</version></dependency> <dependency>    <groupId>com.google.zxing</groupId>    <artifactId>javase</artifactId>    <version>3.3.3</version></dependency>

(2)然后,建立一二维码处理工具类QRCodeUtil,其核心代码如下所示:

public class QRCodeUtil {    private static final Logger log= LoggerFactory.getLogger(QRCodeUtil.class);     //CODE_WIDTH:二维码宽度,单位像素    private static final int CODE_WIDTH = 400;    //CODE_HEIGHT:二维码高度,单位像素    private static final int CODE_HEIGHT = 400;    //FRONT_COLOR:二维码前景色,0x000000 表示黑色    private static final int FRONT_COLOR = 0x000000;    //BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色    //演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白    private static final int BACKGROUND_COLOR = 0xFFFFFF;     public static void createCodeToFile(String content, File codeImgFileSaveDir, String fileName) {        try {            if (StringUtils.isBlank(content) || StringUtils.isBlank(fileName)) {                return;            }            content = content.trim();            if (codeImgFileSaveDir==null || codeImgFileSaveDir.isFile()) {                //二维码图片存在目录为空,默认放在桌面...                codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();            }            if (!codeImgFileSaveDir.exists()) {                //二维码图片存在目录不存在,开始创建...                codeImgFileSaveDir.mkdirs();            }             //核心代码-生成二维码            BufferedImage bufferedImage = getBufferedImage(content);             File codeImgFile = new File(codeImgFileSaveDir, fileName);            ImageIO.write(bufferedImage, "png", codeImgFile);             log.info("二维码图片生成成功:" + codeImgFile.getPath());        } catch (Exception e) {            e.printStackTrace();        }    }         public static void createCodeToOutputStream(String content, OutputStream outputStream) {        try {            if (StringUtils.isBlank(content)) {                return;            }            content = content.trim();            //核心代码-生成二维码            BufferedImage bufferedImage = getBufferedImage(content);             //区别就是这一句,输出到输出流中,如果第三个参数是 File,则输出到文件中            ImageIO.write(bufferedImage, "png", outputStream);             log.info("二维码图片生成到输出流成功...");        } catch (Exception e) {            e.printStackTrace();        }    }     //核心代码-生成二维码    private static BufferedImage getBufferedImage(String content) throws WriterException {         //com.google.zxing.EncodeHintType:编码提示类型,枚举类型        Map<EncodeHintType, Object> hints = new HashMap();         //EncodeHintType.CHARACTER_SET:设置字符编码类型        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");         //EncodeHintType.ERROR_CORRECTION:设置误差校正        //ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction        //不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);         //EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近        hints.put(EncodeHintType.MARGIN, 1);                MultiFormatWriter multiFormatWriter = new MultiFormatWriter();        BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);        BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);        for (int x = 0; x < CODE_WIDTH; x++) {            for (int y = 0; y < CODE_HEIGHT; y++) {                bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);            }        }        return bufferedImage;    }}

 上述代码有点多,诸位可以在文末提供的下载地址将其下载下来,并用IDEA等开发工具将其打开,几乎每行代码debug都做了必要的注释,在这里就不赘述了!

 总的来说,上面代码主要包含了两个部分,一部分是将实现如何将信息塞入二维码并将其生成图片存储至物理文件目录下;另一部分是实现如何直接将信息塞入二维码并生成图片最终以图片流的形式将其返回给前端调用端;

(3)最后,我们需要新建一个QrCodeController控制器类,并在其中创建两个请求方法,用于测试Google ZXing工具包这种方式生成两种类型的二维码是否可行,其代码如下所示:

@RequestMapping("qr/code")public class QrCodeController extends BaseController{     private static final String RootPath="E:\\shFiles\\QRCode";    private static final String FileFormat=".png";     private static final ThreadLocal<SimpleDateFormat> LOCALDATEFORMAT=ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmss"));     //生成二维码并将其存放于本地目录    @PostMapping("generate/v1")    public BaseResponse generateV1(String content){        BaseResponse response=new BaseResponse(StatusCode.Success);        try {            final String fileName=LOCALDATEFORMAT.get().format(new Date());            QRCodeUtil.createCodeToFile(content,new File(RootPath),fileName+FileFormat);        }catch (Exception e){            response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());        }        return response;    }     //生成二维码并将其返回给前端调用者    @PostMapping("generate/v2")    public BaseResponse generateV2(String content,HttpServletResponse servletResponse){        BaseResponse response=new BaseResponse(StatusCode.Success);        try {            QRCodeUtil.createCodeToOutputStream(content,servletResponse.getOutputStream());         }catch (Exception e){            response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());        }        return response;}}

 最后是将该项目运行起来并采用Postman对该接口进行测试,首先是控制器第一个方法接口的测试,其测试结果如下图所示(生成的二维码图片是存放在 E:\\shFiles\\QRCode 中的):

 最后是控制器第二个方法接口的测试,其测试结果如下图所示:

PS:如果不想存储二维码图片到实际的文件目录,则可以采用“图片流”的形式将其返回即可;反之,则可以将生成的二维码图片存储起来并返回该图片的访问链接给到前端(这个就稍微有点麻烦了,既要存储、又要赋予图片的访问域名和链接);具体取舍可以根据实际业务情况来做抉择吧!

二、基于开源的Hutool工具生成二维码

 下面,debug换一种实现方式,采用目前比较知名、流行的开源工具Hutool加以实现,同样的道理需要在pom.xml中加入相应的Jar依赖,如下所示:   

 <!--二维码开发工具集-->        <dependency>            <groupId>cn.hutool</groupId>            <artifactId>hutool-all</artifactId>            <version>4.6.10</version>        </dependency>          <!-- zxing生成二维码 -->        <dependency>            <groupId>com.google.zxing</groupId>            <artifactId>core</artifactId>            <version>3.3.3</version>        </dependency>         <dependency>            <groupId>com.google.zxing</groupId>            <artifactId>javase</artifactId>            <version>3.3.3</version>        </dependency>

然后,需要自定义一Java Config配置文件,以Bean的形式显示配置并注入QrConfig,如下代码所示:

package com.example.qrcode.Config; import cn.hutool.extra.qrcode.QrConfig;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration; import java.awt.*; @Configurationpublic class QRCode {    @Bean    public QrConfig qrConfig(){        QrConfig qrConfig=new QrConfig();        qrConfig.setBackColor(Color.white.getRGB());        qrConfig.setForeColor(Color.black.getRGB());        return qrConfig;    }}

 紧接着我们建立一QRService,用于处理真正的生成二维码的业务逻辑,其核心代码如下所示:

package com.example.qrcode.Service; import cn.hutool.extra.qrcode.QrCodeUtil;import cn.hutool.extra.qrcode.QrConfig;import com.example.qrcode.Config.QRCode;import org.springframework.stereotype.Service;import org.springframework.web.bind.annotation.RequestMapping; import javax.annotation.Resource;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.IOException; @Servicepublic class QRService {    @Resource    QrConfig qrconig;    public void generateFile(String content, File file){        //生成到本地文件        QrCodeUtil.generate(content, qrconig, file);    }    //输出到流    public void generateStream(String content, HttpServletResponse response) throws IOException {        QrCodeUtil.generate(content,qrconig,"png",response.getOutputStream());    }}

最终,是在QRController控制器类中进行调用,如下代码所示:

package com.example.qrcode.Controller; import com.example.qrcode.Service.QRService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse;import java.io.IOException; @RestControllerpublic class QRController {    @Autowired    QRService qrService;    @RequestMapping("123")    public void generateV3(String content, HttpServletResponse servletResponse) throws IOException {        qrService.generateStream(content,servletResponse);    }}

通过浏览器访问测试:

如何基于SpringBoot生成二维码

感谢各位的阅读!关于“如何基于SpringBoot生成二维码”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何基于SpringBoot生成二维码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何基于SpringBoot生成二维码

这篇文章给大家分享的是有关如何基于SpringBoot生成二维码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、基于Google开发工具包ZXing生成二维码(1)首先,需要在pom.xml依赖配置文件中加入该
2023-06-29

二维码如何生成

小编给大家分享一下二维码如何生成,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设
2023-06-17

基于google zxing的Java二维码生成与解码

本文实例为大家分享了Java二维码生成与解码的具体代码,供大家参考,具体内容如下一、添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包)
2023-05-31

Android基于google Zxing实现二维码的生成

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长
2022-06-06

基于JS怎么实现二维码名片生成

这篇文章主要介绍“基于JS怎么实现二维码名片生成”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于JS怎么实现二维码名片生成”文章能帮助大家解决问题。演示技术栈这里用到了一个二维码生成库qrcode
2023-07-02

基于Python怎么编写一个二维码生成器

这篇“基于Python怎么编写一个二维码生成器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python怎么编写一个二维
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录