公司想用類似微信掃碼登錄功能,但受到臨時二維碼及永久二維碼個數的限制,決定放棄公衆號自帶的二維碼生成(還有個弊端就是每次掃碼都默認打開跳轉到公衆號,每掃描一次打開一次公衆號,造成打開多個沒必要的頁面)
我只說下具體思路,具體 實現步驟呵呵了
severlet3 async功能自行查閱
創建url二維碼---oauth2URL--重定向相應的用戶確認授權頁面---返回用戶信息
1.創建二維碼
自己創建url二維碼,創建唯一key及token,利用公衆號的oauth2做跳轉連接二維碼
1.1 key 用類區分二維碼的唯一性,token用來識別正確性,掃過過期並15分鐘內過期(我用用redis實現),
oauth2不用多說,跳轉後獲取用戶的身份
2.登錄時候調用時ajax請求獲取登錄二維碼
2.1 客戶端ajax 請求獲取二維碼
2.2服務端返回二維碼圖片的base64位編碼及token
web.xml 打開
<async-supported>true</async-supported>
根據客戶端請求掛起請求保存到本地map或redis中
AsyncContext context=getRequest().startAsync();
// 開始請求的掛起
context.setTimeout(0);
System.out.println("ip:"+ip+"----token:"+token+"----sysCode:"+sysCode);
// 把異步上下文放在列表中以備將來之用
CONNECTIONS.put(token, context);
3.微信掃描跳轉到服務端oauth2認證,獲取用戶身份重定向到相應的url
3.1通過微信api獲取用戶身份
3.2獲取用戶身份後重定向到想用的確認登錄頁面
3.3點擊確認將掛起的請求返回相應的用戶信息
AsyncContext context =CONNECTIONS.get(mapkey);
HttpServletResponse response = (HttpServletResponse) context.getResponse();
out.print(ret.toJson());
out.flush();
out.close();
//向掛起的請求發送事件
context.complete();
CONNECTIONS.remove(mapkey);
刪除token