Java:扫码登录

news2024/12/23 5:03:02

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

目录

一、需求背景

二、问题分析

三、对比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;
    }
}

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


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1403263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络要素服务(WFS)详解

文章目录 1. 概述2. GetCapabilities3. DescribeFeatureType4. GetFeature4.1 Get访问方式4.2 Post访问方式 5. Transaction5.1 Insert5.2 Replace5.3 Update5.4 Delete 6 注意事项 1. 概述 前置文章&#xff1a; 地图服务器GeoServer的安装与配置 GeoServer发布地图服务&#…

洛谷P2911 [USACO08OCT] Bovine Bones G(C语言)

看到这么小的数据范围&#xff0c;那当然是暴力枚举啦&#xff01;况且这还是入门题&#xff0c;怎么可能如此难为我这种萌新呢。 我的思路是用数组下标来记录次数 ch[ijq]; 这就是用三个数的和当做下标 然后后面就是遍利数组找出要的值 # include <stdio.h> int main …

Windows 下ffmpeg安装及实践

Windows 下ffmpeg安装及实践 背景安装实践其他 背景 最近负责音频文件处理相关的业务&#xff0c;涉及到 ffmpeg 对一些音频文件格式的校验&#xff0c;记录一下安装过程及踩坑过程。 安装 如图1所示&#xff0c;进入官网&#xff0c;在windows下任选一个文件&#xff1a;h…

七、文件与目录操作

一、文本文件读写 文件打开方式QIODevice::ReadOnly 以只读方式打开 QIODevice::QriteOnly 以只写方式打开 QIODevice::ReadWrite 以读写方式打开 QIODevice::Append 新增加的内容将被追加到文件末尾 QIODevice::Truncate 以重写的方式打开&#xff0c;原有内容会被删除 QI…

makefile 编译动态链接库使用(.so库文件)

makefile 编译动态链接库使用&#xff08;.so库文件&#xff09; 动态链接库:不会把代码编译到二进制文件中&#xff0c;而是在运行时才去加载&#xff0c; 好处是程序可以和库文件分离&#xff0c;可以分别发版&#xff0c;然后库文件可以被多处共享 动态链接库 动态&#…

java servlet 学生成绩查询管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web学生成绩查询管理系统是一套完善的java web信息管理系统 采用servlet dao bean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发…

插混、增程、纯电为什么说纯电是未来的趋势

技术路线&#xff1a;插混、增程、纯电趋势判断 新能源汽车目前有纯电动、增程式、插电式3 种主流技术路径&#xff0c;其中增程式和插电式均为混动技术。纯电动汽车是指以动力电池为动力&#xff0c;用电机驱动车轮行驶&#xff1b;混动技术分为串联、并联、混联3 种模式&…

一个 web版linux、数据库、redis、mongo统一管理操作平台

mayfly-go&#xff1a;一个 web版linux、数据库、redis、mongo统一管理操作平台 功能介绍 linux&#xff1a; ssh终端(终端操作记录回放)&#xff0c;文件查看&#xff08;可根据常见后缀名高亮显示关键词等&#xff09;、修改、上传、下载、删除等&#xff0c;脚本管理执行&…

Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)

目录 Spring&#xff08;概述特点IOC原理IOC并操作之bean的XML管理操作&#xff09;概述Spring是轻量级的开源的JavaEE框架Spring可以解决企业应用开发的复杂性Spring有两个核心部分ioc,aopSpring特点 loc(概念和原理)什么是 IOCIOC 底层原理IOC 过程图 IOC&#xff08;接口&am…

蓝桥杯重要知识点和赛题直通车

<蓝桥杯软件赛>零基础备赛20周 第 1周(2023-10-23): 蓝桥杯软件赛介绍官方链接零基础能得奖吗&#xff1f; 第 2周(2023-10-30): 常考知识点蓝桥杯怎么判题备赛计划 第 3周(2023-11-06): 填空题&#xff08;分数少但越来越不好做&#xff09; 第 4周(2023-11-13): &#…

免费在线压缩图片网站分享

支持批量压缩处理&#xff0c;但需要注意&#xff0c;网站仅仅支持体积为5MB的图片&#xff0c;压缩率高达66%&#xff0c;压缩完成后&#xff0c;点下Donwnload all&#xff0c;就能将图片保存至本地。 网页端直接进行图片压缩 https://tinify.cn/

软件测试到底是选择自学还是报培训机构(纯个人经验分享)----分享给正在迷茫的学弟学妹们!

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

IOS工程师,再不转型!失业在所难免!

随着智能手机的快速普及&#xff0c;移动应用开发成为了一个炙手可热的职业。而在手机市场上&#xff0c;以前主要是iOS和Android是两个操作系统。近几年在中国市场上&#xff0c;iPhone手机销量持续下滑&#xff0c;与之相反&#xff0c;华为手机一直处于领先地位。这对于从事…

【立创EDA-PCB设计基础】3.网络表概念解读+板框绘制

前言&#xff1a;本文对网络表概念解读板框绘制&#xff08;确定PCB板子轮廓&#xff09; 网络表概念解读 在本专栏的上一篇文章【嘉立创EDA-PCB设计指南】2&#xff0c;将设计的原理图转为了PCB&#xff0c;在PCB界面下出现了所有的封装&#xff0c;以及所有的飞线属性&…

数据集笔记:UJIIndoorLoc

1 数据集介绍 UJIIndoorLoc - UCI Machine Learning Repository UJIIndoorLoc是一个多建筑多楼层的室内定位数据库&#xff0c;用于测试依赖于WLAN/WiFi指纹的室内定位系统。 2 数据读取 数据分类训练数据和测试数据 import pandas as pdapd.read_csv(Downloads/ujiindoo…

Bit Extraction and Bootstrapping for BGV/BFV

参考文献&#xff1a; [GHS12] Gentry C, Halevi S, Smart N P. Better bootstrapping in fully homomorphic encryption[C]//International Workshop on Public Key Cryptography. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 1-16.[AP13] Alperin-Sheriff J, Pe…

Python文件操作和异常处理:高效处理数据的利器

文章目录 一、引言1.1 文件操作和异常处理对于编程的重要性1.2 Python作为实现文件操作和异常处理的强大工具 二、为什么学习文件操作和异常处理2.1 处理各种文件格式&#xff1a;从文本到图像到音频等2.2 确保代码的鲁棒性&#xff1a;有效处理异常情况 三、文件读取和写入3.1…

Duplicate object key json(520)

亲爱的码友&#xff0c;当你看到这个错误 请查看一下你的json文件内容的关键词是不是重复了 举个栗子&#x1f330; 往下翻翻&#xff1a; 删一个就行&#xff01;&#xff01;&#xff01; 被自己傻哭了吧&#x1f923;&#x1f923;&#x1f923;

阿里云优惠整理,最新2024阿里云优惠政策解读

阿里云优惠政策有哪些&#xff1f;2024年阿里云优惠政策风向改了&#xff0c;之前一直是老用户与狗的营销策略&#xff0c;今年阿里云2核2G、3M固定带宽服务器99元居然开启了老用户购买权限&#xff0c;并且续费不涨价&#xff0c;阿里云这波操作确实让用户赢麻了&#xff0c;在…

数据可视化 | 期末复习 | 补档

文章目录 &#x1f4da;介绍可视化&#x1f407;什么是可视化&#x1f407;科学可视化&#xff0c;信息可视化&#xff0c;可视分析系统三者之间有什么区别&#x1f525;&#x1f407;可视化的基本流程&#x1f407;可视化的两个基本设计原则&#x1f407;数据属性&#x1f407…