Maven

本次使用的Googel开源的ZXing来实现二维码的生成。

   <dependency>
       <groupId>com.google.zxing</groupId>
       <artifactId>core</artifactId>
       <version>3.4.0</version>
   </dependency>
   <dependency>
       <groupId>com.google.zxing</groupId>
       <artifactId>javase</artifactId>
       <version>3.4.0</version>
   </dependency>

生成二维码并保存到本地

    public static void saveLocalQR() throws WriterException, IOException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        // hints是可选参数
        Map<EncodeHintType, Object> hints = new HashMap<>(1);
        // 容错率
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 字符集
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 第一个参数为二维码的内容 第二个参数不变  第三、四 个参数依次为 宽高
        BitMatrix bitMatrix = qrCodeWriter.encode("https://xffjs.com", BarcodeFormat.QR_CODE, 500, 500, hints);
        // 将二维码保存为 png 本地图片。
        MatrixToImageWriter.writeToPath(bitMatrix, "png", Paths.get("E:\\qr2.png"));
    }

hints是可选的参数,用于控制编码的字符集和纠错率。

生成Base64格式

   public static void saveWriter() throws WriterException, IOException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        // 第一个参数为二维码的内容 第二个参数不变  第三、四 个参数依次为 宽高
        BitMatrix bitMatrix = qrCodeWriter.encode("https://baidu.com", BarcodeFormat.QR_CODE, 500, 500);
        MatrixToImageWriter.writeToStream(bitMatrix, "png", byteArrayOutputStream);
        byte[] bytes = byteArrayOutputStream.toByteArray();
        String base64Image = new BASE64Encoder().encode(bytes);
        System.out.println(base64Image);
    }

动态生成

@Controller
@RequestMapping("/qr")
public class QRController {

    @GetMapping("/felord")
   public void gen(HttpServletResponse response) throws IOException, WriterException {
       response.setContentType("image/png");
       ServletOutputStream outputStream = response.getOutputStream();
       outputStream.write(imageBytes());
       outputStream.flush();
       outputStream.close();
   }


   private byte [] imageBytes() throws IOException, WriterException {
       QRCodeWriter qrCodeWriter = new QRCodeWriter();

       Map<EncodeHintType, Object> hints = new HashMap<>();
       hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
       hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");

       BitMatrix bitMatrix = qrCodeWriter.encode("https://xffjs.com", BarcodeFormat.QR_CODE, 80, 80,hints);

       ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
       MatrixToImageWriter.writeToStream(bitMatrix,"png",byteArrayOutputStream);
      return byteArrayOutputStream.toByteArray();
   }

}

注意事项

1、尽量避免在二维码中传递敏感的明文信息,应对其进行摘要处理或者脱敏。
2、对于比较长的网址应该使用短网址服务以减少二维码的信息载荷。
3、尽量保证二维码一定时间内的唯一性,比如加一些无意义随机值等。
4、其实也有其它一些功能强大开箱即用的的zxing二次封装库可用,比如 qrext4j