Java:扫码登录

发布时间:2024年01月22日

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、需求背景

二、问题分析

三、对比APP和打印机设备的特点

四、设计

五、编码

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、需求背景

通过手机APP扫码登录共享打印机设备,然后读取该用户要打印的任务,并打印

二、问题分析

很明显这是跨设备了,一个是手机,一个是打印机

直接通过手机把用户名密码传输过去,也不安全

扫码登录,这种方式就有了用武之地,相当于授权登录。

三、对比APP和打印机设备的特点

APP:设备保持登录状态,不论何时打开APP,都是已登录状态。

打印机设备:没有输入用户名密码的地方

常用APP的用户,会发现,APP登录一次之后,除非主动退出,否则一直保持登录态,这是怎么做到的呢?我们发现不变的是手机,或者说是这个手机的一个唯一标识,我们称之为设备ID。

首次APP登录之后,就会将设备ID和登录态关联起来,所以只要手机不变,登录态就能长久保持。

打印机的核心功能是打印,不需要登录,只要把任务给它即可。

四、设计

接下来我分享一下我的设计思路

4.1 首先,打印机需要有一个授权登录的入口,就是二维码,系统得有一个生成二维码的功能,生成的二维码链接里关联打印机的设备ID,用于指定哪个打印机在进行授权登录。

4.2 接下来,就是扫码的环节了,扫描二维码实际上是访问了链接所代表的接口,该接口中主要逻辑包含以下几点:1)获取当前APP的设备ID;2)校验该设备ID的登录态;3)变更打印机设备登录状态为待确认。

4.3 这时候,手机会跳转到待确认页面。

4.4 手机操作确认登录,打印机获取登录态成功,然后进入任务列表页,读取待处理任务。

4.5 勾选任务,然后进行打印。

完整的设计图如下:

这里边,一旦状态变为待确认状态后,打印机开始轮询拉取最新登录状态。

五、编码

接下来,来个示例代码,感受一下整个过程

生成二维码:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class QRCodeGenerator {
    public static BufferedImage generateQRCode(String deviceId, int width, int height) throws WriterException, IOException {
        String qrCodeText = "deviceId=" + deviceId; // 将设备ID作为二维码内容
        
        // 设置二维码参数
        java.util.Map<EncodeHintType, Object> hints = new java.util.HashMap<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        
        // 生成二维码矩阵
        BitMatrix bitMatrix = new MultiFormatWriter().encode(qrCodeText, BarcodeFormat.QR_CODE, width, height, hints);
        
        // 将二维码矩阵转换为BufferedImage对象
        BufferedImage qrCodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int color = bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF; // 黑色表示前景,白色表示背景
                qrCodeImage.setRGB(x, y, color);
            }
        }
        
        return qrCodeImage;
    }
}

扫描二维码:

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;

public class QRCodeScannerActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_SCAN = 1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qr_scanner);
        
        // 启动扫描二维码的Activity
        Intent intent = new Intent(this, ZXingScannerActivity.class);
        startActivityForResult(intent, REQUEST_CODE_SCAN);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
            // 处理扫描结果
            String qrCodeContent = data.getStringExtra("qrCodeContent");
            String deviceId = extractDeviceIdFromQRCodeContent(qrCodeContent);
            // TODO: 使用deviceId进行登录或其他操作
        }
    }
    
    private String extractDeviceIdFromQRCodeContent(String qrCodeContent) {
        // 解析二维码内容,提取设备ID
        // TODO: 实现解析逻辑,返回设备ID字符串
        return null;
    }
}

确认登录:

public class LoginManager {
    public void confirmLogin(String deviceId) {
        // TODO: 根据设备ID进行登录验证和处理逻辑
    }
}

轮询获取当前设备登录态:

public class LoginStatusChecker {
    public boolean isLoggedIn(String deviceId) {
        // TODO: 根据设备ID检查登录状态并返回结果
        return false;
    }
}

后续的读取任务列表和打印,就不再赘述了。?


总结

大厂面试经常问,重要的是思路,多动脑思考。

文章来源:https://blog.csdn.net/ql_gome/article/details/135753192
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。