Java:扫码登录

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

目录

一、需求背景

二、问题分析

三、对比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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_qr_scanner);// 启动扫描二维码的ActivityIntent intent = new Intent(this, ZXingScannerActivity.class);startActivityForResult(intent, REQUEST_CODE_SCAN);}@Overrideprotected 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.mzph.cn/news/640607.shtml

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

相关文章

美团收银餐饮版培训教程

硬件连接方式及介绍: 双屏收银机 收银一体机 双屏收银机连接图 收银一体机连接图 前台打印机 后厨打印机 标签打印机 前台打印机连接图 后厨打印机连接图 其它收银机配件 软件前期设置 1、机器联网 点开桌面的设置&#xff0c;点击更多&#xff0c;点击以太网&#xff0c;最上…

Linux,常见的强制退出/结束命令(ctr+c/ctr+d/:q/exit)

PS&#xff1a; 一直搞不清楚&#xff0c;这四个命令区别&#xff0c;干脆每个都输入一遍&#xff0c;逮着哪个算哪个。 1. CtrlC用途&#xff1a; 中断正在运行的程序或命令。&#xff08;例如输入Ping命令一直处于等待状态&#xff0c;就像是进程一直等待干脆杀死&#xff0…

SpringBoot之文件上传

1、文件上传原理&#x1f618; 表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 当表单的enctype"application/x-www-form-urlencoded"&#xff08;默认&#xff09;时&#xff0c;form表单中的数据格式为&#xff1a;keyvalue&keyvalue …

《Linux高性能服务器编程》笔记03

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第07章 Linux服务器程序规范7.1日志7.2用…

C#指定年份计算十二生肖

目录 一、GetSexagenary Year方法 二、GetTerrestrialBranch方法 三、实例 使用ChineseLunisolarCalendar的GetSexagenaryYear和GetTerrestrialBranch方法判断生肖信息。 一、GetSexagenary Year方法 ChineseLunisolarCalendar对象的GetSexagenaryYear方法用于计算与指定日…

把Mybatis Generator生成的代码加上想要的注释

1 前言 在日常开发工作中&#xff0c;我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件。但是Mybatis Generator默认生成的代码中&#xff0c;注释并不是我们想要的&#xff0c;所以一般在Generator配置文件中&#xff0c;会设置不自动生成注释。带来的问题…

【数据结构】在链队列中你可能忽视的二三事

链队列及其基本操作的C语言实现 导言一、链队列二、链队列的基本操作的实现2.1 链队列的数据类型2.2 链队列的初始化2.2.1 带头结点的链队列的初始化2.2.3 不带头结点的链队列的初始化 2.3 链队列的判空2.3.1 带头结点的链队列的判空2.3.2 不带头结点的链队列的判空 2.4 链队列…

C++知识--函数重载和缺省

一.缺省 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 实际上缺省是分为以下几种情况的&#xff1a; 1.全缺省参数 #include <iostream>//全缺省 void…

IS-IS:01 ISIS基本配置

这是实验拓扑&#xff0c;下面是基本配置&#xff1a; R1: sys sysname R1 user-interface console 0 idle-timeout 0 0 int loop 0 ip add 1.1.1.1 24 int g0/0/0 ip add 192.168.12.1 24 qR2: sys sysname R2 user-interface console 0 idle-timeout 0 0 int loop 0 ip add …

C++提高编程——模板

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

samba服务搭建,并将共享目录映射到windows

系统版本&#xff1a;centos7 1、centos 安装samba yum -y install samba 2、查看安装信息 rpm -qa |grep samba 3、设置开机自启动 systemctl enable smb.service systemctl enable nmb.service 4、设置samba服务器配置文件 sudo vi /etc/samba/smb.conf 注意&#…

CentOS 系统创建网卡bond0

很多时候在机房运维的过程中&#xff0c;我们会遇到客户要求的建立网卡光口的bond0设置&#xff0c;通俗点说就是将两个光口合并为一个口进行链接设置。创建这个设置是有两种设置&#xff0c;一是在安装系统的过程中对bond0进行创建设置&#xff0c;另一种就是通过系统里面对网…

Mac使用adb调试安卓手机

0x00 背景 最近windows电脑休息&#xff0c;用mac办公比较多&#xff0c;手机用时间长了&#xff0c;不太灵光&#xff0c;准备修理一番。于是要用mac调试下android手机。配置略显麻烦&#xff0c;网上的步骤多参差不齐。估计是入门步骤&#xff0c;大佬们也懒得写的太细。于是…

14.1.1 ASP简介

14.1.1 ASP简介 ASP 的全称是Active Server Pages&#xff0c;是由鼎鼎大名的Microsoft(微软)公司开发的服务器端语言。有强大的微软做后盾&#xff0c;ASP在众多的服务器端语言中长久不衰&#xff0c;至今仍有成千上万的网站在使用ASP语言。ASP 内置于IIS中&#xff0c;只要安…

【趣味题-07】20240121他的第一周工资(精准推测工资)

背景需求 设计过程&#xff1a; AI写了很多的答案&#xff0c;但是都不正确 于是我去查看了网上的正确答案——47.41美元 此外&#xff0c;题目的0.99涉及了浮点数&#xff0c;非整数&#xff0c;无法range遍历 最后终于有一个答案正确的代码 通过反复测试&#xff0c;终于写出…

详细版Git的下载安装与配置(Windows)

一、git的下载 Git是一个非常好用的版本控制工具。下载地址如下&#xff1a;Git - Downloads。建议使用国内浏览器下载&#xff0c;因为不用翻墙&#xff0c;速度快。 当你用浏览器去访问上面的地址后&#xff0c;下载页面会自动识别你的电脑系统&#xff0c;如下 点击&#…

NVMe TCG安全数据存储简介

NVMe&#xff08;非易失性内存主机控制器接口规范&#xff09;与TCG&#xff08;可信计算组&#xff09;的集成主要体现在数据安全、固件验证和硬件信任根等方面&#xff0c;以确保存储设备的数据保护能力和安全性。 TCG Opal定义了一套针对自加密硬盘&#xff08;SED, Self-En…

python操作word-样式

字体 引入 from docx.shared import Pt, Inches, RGBColor 加粗 # 加粗1 p1.add_run(这是内容1.1_加粗\n).font.bold True # 加粗2 p1 doc1.add_paragraph(这是段落1&#xff1a;\n) p1.runs[0].font.bold True 斜体 p1.add_run(这是内容1.2_斜体\n).font.italic True …

python蓝桥杯备考——字符串小知识点

python蓝桥杯备考——字符串小知识点 一、 问题解释&#xff1a; .join(str(k) for k in sorted(set(l)))含义和用法二、练习题目&#xff1a;完数的判断补充知识点&#xff1a; 一、 问题解释&#xff1a;’ .join(str(k) for k in sorted(set(l)))含义和用法 print(i, its f…

找不到msvcr100dll或msvcr100dll丢失怎么办,5种靠谱的解决方法分享

MSVCR100.dll文件的丢失可能会引发一系列系统运行和应用程序功能上的问题。作为Microsoft Visual C运行库中的一个关键动态链接库文件&#xff0c;它的缺失会导致依赖于此文件的软件无法正常启动或执行预期功能。具体表现可能包括但不限于&#xff1a;应用程序崩溃、闪退&#…