時候我們在電腦上開微信的時候人家發(fā)來了二維碼,這時我們卻不知道怎么辦,只能保存圖片然后上傳到網(wǎng)站上去識別,這樣是不是有點麻煩了,這時我們只需要一個普通的小工具就能解決頻繁打開網(wǎng)站去掃描二維碼的情況,那么我們就來看下小工具的介紹。
首先它的界面很簡單,上面的一行工具欄下面來講解。
工具欄功能介紹:
實際使用方法:點擊然后選擇屏幕上的二維碼就可以識別了。網(wǎng)站上的什么的都可以這樣做。
也可以這樣:復制圖片,然后點擊上面的從剪貼板識別二維碼,直接把你復制的圖片識別出來。
生成二維碼,文字,網(wǎng)址都可以。
軟件到用時方恨少,下載收藏備用吧:本期視頻和資源已上傳到網(wǎng)站,歡迎點擊閱讀原文查看。歡迎搜索關注并加入老王研究所交流,我會盡可能回答大家的問題。
起二維碼,似乎一直以來都是手機的專利。不過,有些時候,我們可能希望在電腦上也能掃描二維碼:
當二維碼是個網(wǎng)址時,手機網(wǎng)速不行,掃半天還沒打開網(wǎng)頁
手機內(nèi)有網(wǎng)銀,擔心不安全,電腦反正是男朋友用的,他百毒不侵
手機不在身邊,朋友只發(fā)過來了一個二維碼
……
那么,在電腦上到底能不能掃描二維碼?如果能,又該怎么做呢?在這里,向大家介紹一個供電腦使用的二維碼插件:Anything to QRcode 1.1.2(下面簡稱插件)。當我們在瀏覽器上安裝了該插件時,就可以在瀏覽網(wǎng)頁時掃描二維碼了。
【在瀏覽器上安裝插件】
首先,將插件下載到本地電腦上,然后打開瀏覽器,并將瀏覽器窗口略微縮小一些。再用鼠標左鍵將插件拖到瀏覽器窗口中來。
圖示 將插件拖入瀏覽器窗口
等到插件拖到瀏覽器窗口中以后,再松開鼠標按鈕。此時會彈出一個詢問對話框,請點擊相應按鈕允許添加插件。就這樣,插件就安裝好了。
【怎樣使用插件進行二維碼掃描】
之后,當我們?yōu)g覽網(wǎng)頁時,如果碰到想掃描的二維碼,則可以在二維碼圖片上右擊鼠標,選擇“Anything to QRcode”-“解析二維碼”。
這時,將會顯示出該二維碼所包含的實際信息(比如說,一個網(wǎng)址)。接下來,我們就可以根據(jù)獲取的信息做我們想做的事情了。
【注意】
如果該二維碼包含的信息不是網(wǎng)址,而是一個手機 App,則無法在電腦上使用該插件解析成功。
在很多PC端的網(wǎng)站為了用戶登錄方便都提供了掃描二維碼實現(xiàn)用戶登錄的功能,通過移動端掃描PC端的二維碼并且在移動端進行用戶確認登錄之后實現(xiàn)PC端網(wǎng)頁的登錄操作。而對于掃碼登錄來講其實現(xiàn)方式也比較簡單,下面我們就來基于SpringBoot實現(xiàn)一個掃描登錄功能。
在SpringBoot項目中我們可以利用第三方庫來自己生成二維碼,或者是我們可以調(diào)用一些第三方的系統(tǒng),例如微信、QQ、或者是其他平臺來生成二維碼的連接。下面我們演示如何使用Zxing來生成一個二維碼。代碼如下。
public class QRCodeLoginController {
private String generateQRCode(String loginToken) {
String qrCodeBase64=null;
try {
// 設置二維碼參數(shù)
int width=300;
int height=300;
String charset="UTF-8";
String qrCodeData="loginToken=" + loginToken;
// 使用zxing庫生成二維碼圖片
QRCodeWriter qrCodeWriter=new QRCodeWriter();
BitMatrix bitMatrix=qrCodeWriter.encode(qrCodeData, BarcodeFormat.QR_CODE, width, height);
// 將BitMatrix轉(zhuǎn)換為BufferedImage
BufferedImage bufferedImage=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bufferedImage.createGraphics();
Graphics2D graphics=(Graphics2D) bufferedImage.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
graphics.setColor(Color.BLACK);
for (int i=0; i < width; i++) {
for (int j=0; j < height; j++) {
if (bitMatrix.get(i, j)) {
graphics.fillRect(i, j, 1, 1);
}
}
}
// 將BufferedImage轉(zhuǎn)換為Base64編碼
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
byte[] bytes=baos.toByteArray();
qrCodeBase64=Base64.getEncoder().encodeToString(bytes);
} catch (WriterException | IOException e) {
e.printStackTrace();
}
return qrCodeBase64;
}
}
生成二維碼之后,可以將二維碼連接顯示到登錄頁面上。這里需要注意,生成的二維碼中一定要包含一個隨機生成的唯一的用來完成登錄操作的唯一標識,通過這個唯一標識來驗證用戶的登錄操作。如下所示。
@GetMapping("/login")
public String getQRCode() {
// 生成隨機登錄標識符
loginToken=UUID.randomUUID().toString();
// 生成二維碼圖片
String qrCodeUrl=generateQRCode(loginToken);
return qrCodeUrl;
}
在很多時候開發(fā)者對于生成二維碼,進行用戶唯一ID校驗都沒有什么疑惑,唯獨就對前端如何進行調(diào)用而產(chǎn)生了疑惑,到底是通過輪詢的方式還是通過WebSocket的方式來進行接口驗證調(diào)用來判斷到底用戶是否在移動端點擊了授權。
這里我們提供了輪詢的實現(xiàn)方式。在很多的網(wǎng)站實現(xiàn)掃碼登錄的時候都采用了這種方式,通過定時輪詢檢查用戶是否在移動端點擊了授權登錄。
<script>
// 定時輪詢檢查登錄狀態(tài)
setInterval(function() {
$.get("/checkLogin", function(data) {
if (data==="Login success") {
// 登錄成功,更新頁面顯示
$("#loginStatus").text("Login successful!");
}
});
}, 3000); // 每隔3秒鐘檢查一次登錄狀態(tài)
</script>
如果用戶點擊了授權登錄的操作,那么當服務端用戶狀態(tài)發(fā)生了變化之后,PC端通過接口檢查用戶狀態(tài)是否授權,來判斷用戶是否可以進入系統(tǒng),授權成功。如下所示。
@GetMapping("/checkLogin")
public ResponseEntity<String> checkLoginStatus() {
if (userLoggedIn(loginToken)) {
// 用戶已經(jīng)掃碼登錄
return ResponseEntity.ok("Login success");
} else {
// 用戶未掃碼登錄
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Login not completed");
}
}
private boolean userLoggedIn(String loginToken) {
// 檢查用戶是否已經(jīng)掃碼登錄,根據(jù)登錄標識符查詢登錄狀態(tài)
// 返回 true 表示用戶已經(jīng)登錄,否則返回 false
// 此處僅作示例,實際情況需要根據(jù)業(yè)務邏輯實現(xiàn)
return false;
}
對于移動端用戶是否認證的功能判斷需要根據(jù)用戶具體的業(yè)務邏輯來實現(xiàn),這里不做展示。
如果在用戶掃描過程中、或者是用戶掃碼完成之后點擊了取消,那么這個時候PC端并不知道用戶的這種操作,輪詢調(diào)用檢查還在繼續(xù),在這種情況下,如果對操作沒有進行處理的話,就會導致網(wǎng)絡資源的消耗。因為PC端一直在輪詢檢查用戶狀態(tài)。所以要對超時情況,異常情況等各種情況進行驗證。
上面我們介紹了關于如何實現(xiàn)PC端掃碼登錄的功能,整體流程分為了四個步驟。第一步、二維碼的生成(包括隨機登錄標識等情況);第二步、前端登錄檢查實現(xiàn);第三步、移動端調(diào)用服務器進行用戶狀態(tài)調(diào)整;第四步:超時或者是異常處理。當然這些操作在單機狀態(tài)下實現(xiàn)起來都沒有問題,但是在分布式、高并發(fā)情況下需要考慮的內(nèi)容就比較多了。希望讀者可以有所區(qū)別。