javaweb實現(xiàn)app掃碼登錄功能
本文為大家分享了javaweb實現(xiàn)app掃碼登錄的具體代碼,供大家參考,具體內(nèi)容如下
1.web頁面主動向服務(wù)器索要一張由服務(wù)器生成包含維一標(biāo)識的二維碼圖片,也可以直接向后臺索要一個維一標(biāo)識,拿到標(biāo)識后通過js生成二維碼。這里本人采用的是第二種方式,至于為什么嗎?個人感覺這樣方便,后臺也不要導(dǎo)入架包,最后將該標(biāo)識存入List集合中,接下來會用到該標(biāo)識
2.app掃碼后解析二維碼內(nèi)的維一標(biāo)識,然后再攜帶該標(biāo)識跟用戶名發(fā)回給服務(wù)器,服務(wù)器接到請求后,遍歷List集合,驗證該標(biāo)識是否為本系統(tǒng)生成的,若是再去驗證用戶名是否存在,若存在這時需將標(biāo)識與用戶名綁定在一起,綁定的方式有好多種。我這里采用一種較為簡單的方法Map的方式,將標(biāo)識做為key 用戶名做為value存在一個全局Map中,表示該用戶已經(jīng)掃過碼,只等接下來的驗證了
3.web頁面從向服務(wù)器索取二維碼或標(biāo)識后(第一步操作之后)就開始通過ajax每隔2秒或幾秒鐘帶上維一標(biāo)識向服務(wù)器發(fā)起檢查請求,通過該標(biāo)識查看Map是否有對應(yīng)的用戶已經(jīng)掃過碼而未登錄,有的話直接登錄,沒有的話繼續(xù)輪尋,當(dāng)然你也可以采用建立長連接的方式
4.以下為后臺代碼
package com.*; @Controller @RequestMapping(value = "/login") public class LoginController{ @Autowired private UserInfoBaseService userInfoBaseService; //存儲二維碼維一標(biāo)識 public static Set<String> tokes = new HashSet<>(); //存儲toke綁定的用戶 public static Map<String,String> users = new HashMap<>(); /** * 生成二維碼維一標(biāo)識Toke * @return */ @ResponseBody @RequestMapping("/generationQRCode") public String generationToken(){ String uid = UUID.randomUUID().toString(); tokes.add(uid); return uid; } /** * app掃碼后將token與用戶綁定 * @param loginName * @param token * @return */ @ResponseBody @RequestMapping("/determine") public ResponseEntity determine(String loginName, String token){ for (String t:tokes) { if(t.equals(token)){ users.put(token,loginName); UserInfo userInfo = userInfoBaseService.getUserByLoginName(loginName); if(null==userInfo){return new ResponseFailure("用戶不存在");} return new ResponseEntity("正在登錄請稍后..."); } } return new ResponseEntity("請求無效"); } /** * Axaj定時請求是否有用戶掃描了二維碼 * @param token */ @ResponseBody @RequestMapping("/scanLogin") public String scanLogin(String token){ if(StringKit.isBlank(token)){return "token is null";} String loginName = users.get(token); if(StringKit.isBlank(loginName)){ return "error";} //Subject subject = SecurityUtils.getSubject(); //注釋的這三行換成你自已的登錄代碼就行了 //subject.logout(); //UsernamePasswordTokenType tokenType = new UsernamePasswordTokenType(loginName, "123456",2); try{ subject.login(tokenType); }catch (Exception e){ e.printStackTrace(); } users.remove(token); tokes.remove(token); return "success"; } }
5.以下為前臺代碼
//獲取維一標(biāo)識token生成二維碼 $.post('${ctx}/login/generationQRCode', function (token) { new QRCode(document.getElementById('qrcode'), {text:token,height:125,width:125}); $('#qrcode').removeAttr('title'); $('#qrcode').attr('token',token); }); //ajax定時查看是否有用戶掃碼后未登入 var time = window.setInterval(function () { var token = $('#qrcode').attr('token'); if(token){ $.post('${ctx}/login/scanLogin',{'token':token},function (data) { if(data == 'success'){ clearInterval(time); window.location.href = '${ctx}/login/'; } }) } },1000);
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java.lang.UnsupportedOperationException的問題解決
本文主要介紹了java.lang.UnsupportedOperationException的問題解決,該錯誤表示調(diào)用的方法不被支持或不可用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Spring如何使用PropertyPlaceholderConfigurer讀取文件
這篇文章主要介紹了Spring如何使用PropertyPlaceholderConfigurer讀取文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12Spring Cloud學(xué)習(xí)教程之Zuul統(tǒng)一異常處理與回退
Spring Cloud Zuul對異常的處理整體來說還是比較方便的,流程也比較清晰,下面這篇文章主要給大家介紹了關(guān)于Spring Cloud學(xué)習(xí)教程之Zuul統(tǒng)一異常處理與回退的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04全面解析Hibernate關(guān)聯(lián)操作、查詢操作、高級特性、并發(fā)處理機制
這篇文章主要介紹了全面解析Hibernate關(guān)聯(lián)操作、查詢操作、高級特性、并發(fā)處理機制的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06