javaweb實(shí)現(xiàn)app掃碼登錄功能
本文為大家分享了javaweb實(shí)現(xiàn)app掃碼登錄的具體代碼,供大家參考,具體內(nèi)容如下
1.web頁面主動(dòng)向服務(wù)器索要一張由服務(wù)器生成包含維一標(biāo)識(shí)的二維碼圖片,也可以直接向后臺(tái)索要一個(gè)維一標(biāo)識(shí),拿到標(biāo)識(shí)后通過js生成二維碼。這里本人采用的是第二種方式,至于為什么嗎?個(gè)人感覺這樣方便,后臺(tái)也不要導(dǎo)入架包,最后將該標(biāo)識(shí)存入List集合中,接下來會(huì)用到該標(biāo)識(shí)
2.app掃碼后解析二維碼內(nèi)的維一標(biāo)識(shí),然后再攜帶該標(biāo)識(shí)跟用戶名發(fā)回給服務(wù)器,服務(wù)器接到請(qǐng)求后,遍歷List集合,驗(yàn)證該標(biāo)識(shí)是否為本系統(tǒng)生成的,若是再去驗(yàn)證用戶名是否存在,若存在這時(shí)需將標(biāo)識(shí)與用戶名綁定在一起,綁定的方式有好多種。我這里采用一種較為簡單的方法Map的方式,將標(biāo)識(shí)做為key 用戶名做為value存在一個(gè)全局Map中,表示該用戶已經(jīng)掃過碼,只等接下來的驗(yàn)證了
3.web頁面從向服務(wù)器索取二維碼或標(biāo)識(shí)后(第一步操作之后)就開始通過ajax每隔2秒或幾秒鐘帶上維一標(biāo)識(shí)向服務(wù)器發(fā)起檢查請(qǐng)求,通過該標(biāo)識(shí)查看Map是否有對(duì)應(yīng)的用戶已經(jīng)掃過碼而未登錄,有的話直接登錄,沒有的話繼續(xù)輪尋,當(dāng)然你也可以采用建立長連接的方式
4.以下為后臺(tái)代碼
package com.*;
@Controller
@RequestMapping(value = "/login")
public class LoginController{
@Autowired
private UserInfoBaseService userInfoBaseService;
//存儲(chǔ)二維碼維一標(biāo)識(shí)
public static Set<String> tokes = new HashSet<>();
//存儲(chǔ)toke綁定的用戶
public static Map<String,String> users = new HashMap<>();
/**
* 生成二維碼維一標(biāo)識(shí)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("正在登錄請(qǐng)稍后...");
}
}
return new ResponseEntity("請(qǐng)求無效");
}
/**
* Axaj定時(shí)請(qǐng)求是否有用戶掃描了二維碼
* @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.以下為前臺(tái)代碼
//獲取維一標(biāo)識(shí)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定時(shí)查看是否有用戶掃碼后未登入
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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于@SpringBootApplication詳解
這篇文章主要介紹了關(guān)于@SpringBootApplication的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
你應(yīng)該知道的21個(gè)Java核心技術(shù)
Java的21個(gè)核心技術(shù)點(diǎn),你知道嗎?這篇文章主要為大家詳細(xì)介紹了Java核心技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Springboot下swagger-ui.html訪問不到的解決方案
這篇文章主要介紹了Springboot下swagger-ui.html訪問不到的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
解決shiro 定時(shí)監(jiān)聽器不生效的問題 onExpiration不調(diào)用問題
這篇文章主要介紹了解決shiro 定時(shí)監(jiān)聽器不生效的問題 onExpiration不調(diào)用問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

