聊天室原始碼開發,如何簡單的實現掃碼登入功能?
前言
實現思路
實現步驟
1、使用者訪問聊天室原始碼,選擇掃碼登入
/** * 生成二維碼內容 * * @return 結果 */@GetMapping("/generate")public BaseResult generate() { String code = IdUtil.simpleUUID(); redisCache.setCacheObject(code, CodeUtils.getUnusedCodeInfo(), DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS); return BaseResult.success(GENERATE_SUCCESS, code);}
getToken() { this.codeStatus = 'EMPTY' this.tip = '正在獲取登入碼,請稍等' // 有效時間 60 秒 this.effectiveSeconds = 60 clearInterval(this.timer) request({ method: 'get', url: '/code/generate' }).then((response) => { // 請求成功, 設定二維碼內容, 並更新相關資訊 this.code = `${HOST}/code/scan?code=${response.data}` this.codeStatus = 'UNUSED' this.tip = '請使用手機掃碼登入' this.timer = setInterval(this.getTokenInfo, 2000) }).catch(() => { this.getToken() })}
/** * 獲取二維碼狀態資訊 * * @param code 二維碼 * @return 結果 */@GetMapping("/info")public BaseResult info(String code) { CodeVO codeVO = redisCache.getCacheObject(code); if (codeVO == null) { return BaseResult.success(INVALID_CODE, StringUtils.EMPTY); } return BaseResult.success(GET_SUCCESS, codeVO);}
getTokenInfo() { this.effectiveSeconds-- // 二維碼過期 if (this.effectiveSeconds <= 0) { this.codeStatus = 'EXPIRE' this.tip = '二維碼已過期,請重新整理' return } // 輪詢查詢二維碼狀態 request({ method: 'get', url: '/code/info', params: { code: this.code.substr(this.code.indexOf('=') + 1) } }).then(response => { const codeVO = response.data // 二維碼過期 if (!codeVO || !codeVO.codeStatus) { this.codeStatus = 'EXPIRE' this.tip = '二維碼已過期,請重新整理' return } // 二維碼狀態為為正在登入 if (codeVO.codeStatus === 'CONFIRMING') { this.username = codeVO.username this.avatar = codeVO.avatar this.codeStatus = 'CONFIRMING' this.tip = '掃碼成功,請在手機上確認' return } // 二維碼狀態為確認登入 if (codeVO.codeStatus === 'CONFIRMED') { clearInterval(this.timer) const token = codeVO.token store.commit('setToken', token) this.$router.push('/home') Message.success('登入成功') return } })}
2、使用手機掃碼,二維碼狀態改變
/** * 處理未使用狀態的二維碼 * * @param code 二維碼 * @param token token * @return 結果 */private BaseResult handleUnusedQr(String code, String token) { // 校驗 app 端訪問傳遞的 token boolean isLegal = JwtUtils.verify(token); if (!isLegal) { return BaseResult.error(AUTHENTICATION_FAILED); } // 儲存使用者名稱、頭像資訊, 供前端展示 String username = JwtUtils.getUsername(token); CodeVO codeVO = CodeUtils.getConfirmingCodeInfo(username, DEFAULT_AVATAR_URL); redisCache.setCacheObject(code, codeVO, DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS); // 返回登入地址、瀏覽器、作業系統以及一個臨時 token 給 app String address = HttpUtils.getRealAddressByIp(); String browser = HttpUtils.getBrowserName(); String os = HttpUtils.getOsName(); String tmpToken = JwtUtils.sign(username); // 將臨時 token 作為鍵, 使用者名稱為內容儲存在 redis 中 redisCache.setCacheObject(tmpToken, username, DEFAULT_TEMP_TOKEN_EXPIRE_MINUTES, TimeUnit.MINUTES); LoginInfoVO loginInfoVO = new LoginInfoVO(address, browser, os, tmpToken); return BaseResult.success(SCAN_SUCCESS, loginInfoVO);}
3、手機確認登入
/** * 處理未待確認狀態的二維碼 * * @param code 二維碼 * @param token token * @return 結果 */private BaseResult handleConfirmingQr(String code, String token) { // 使用臨時 token 獲取使用者名稱, 並從 redis 中刪除臨時 token String username = redisCache.getCacheObject(token); if (StringUtils.isBlank(username)) { return BaseResult.error(AUTHENTICATION_FAILED); } redisCache.deleteObject(token); // 根據使用者名稱生成正式 token並儲存在 redis 中供前端使用 String formalToken = JwtUtils.sign(username); CodeVO codeVO = CodeUtils.getConfirmedCodeInfo(username, DEFAULT_AVATAR_URL, formalToken); redisCache.setCacheObject(code, codeVO, DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS); return BaseResult.success(CONFIRM_SUCCESS);}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2837626/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 面試官:如何實現掃碼登入功能?面試
- IM的掃碼登入功能如何實現?一文搞懂主流的掃碼登入技術原理
- 聊天室原始碼開發中防抖節流的簡單實現原始碼
- 聊聊公眾號聯動掃碼登入功能如何實現
- Java 語言實現簡易版掃碼登入Java
- 用Java程式碼實現一個簡單的聊天室功能Java
- 小視訊app原始碼,實現簡單的登入介面,輸入賬號密碼APP原始碼密碼
- uniapp實現釘釘掃碼登入APP
- [文件教程]PHP實現微信開放平臺掃碼登入原始碼下載PHP原始碼
- 遊戲陪玩原始碼的登入方式,簡訊驗證碼登入的實現遊戲原始碼
- 騰訊遊戲掃碼登入原始碼遊戲原始碼
- 一對一直播原始碼,實現一個簡單的登入介面原始碼
- JSP(ajax)+Servlet實現簡單的登入功能JSServlet
- Authing新功能——小程式掃碼登入
- 如何實現直播間原始碼重要的簡訊驗證碼功能原始碼
- 微信掃碼登入的技術實現思考
- 如何在遊戲陪玩app原始碼中實現簡訊驗證碼登入?遊戲APP原始碼
- 相親交友原始碼開發,前端如何實現水印功能?原始碼前端
- 用go封裝和實現掃碼登入Go封裝
- App 掃碼登入 pc 端(不是微信第三方掃碼登入)怎麼實現?APP
- Android | 教你如何開發掃二維碼功能Android
- 掃碼登入是這樣登入的
- Flask-Login 讓實現登入功能變簡單Flask
- Python——奇怪的掃碼登入Python
- spring boot高效能實現二維碼掃碼登入(上)——單伺服器版Spring Boot伺服器
- Android 基於zxing的二維碼掃描功能的簡單實現及優化Android優化
- 成品直播原始碼推薦,登入和註冊兩個頁面的簡單實現原始碼
- 說說如何在登入頁實現生成驗證碼功能
- flask框架如何實現修改密碼和免密登入功能Flask框架密碼
- 小程式簡訊驗證碼登入,1分鐘實現小程式發簡訊功能,藉助雲開發10行程式碼行程
- 直播平臺原始碼開發,簽到功能的實現原始碼
- vue實現簡訊驗證碼登入Vue
- uniapp 實現簡訊驗證碼登入APP
- 聊天室原始碼開發,如何實現前端渲染迴流與重排問題的優化?原始碼前端優化
- Java Web簡單登陸功能的實現JavaWeb
- 微信掃碼登入
- Laravel + Laravel-echo + EasyWeChat 實現微信掃碼登入Laravel
- 微信掃小程式碼實現網頁端登入網頁