公衆號防掃描登錄


 


     公司想用類似微信掃碼登錄功能,但受到臨時二維碼及永久二維碼個數的限制,決定放棄公衆號自帶的二維碼生成(還有個弊端就是每次掃碼都默認打開跳轉到公衆號,每掃描一次打開一次公衆號,造成打開多個沒必要的頁面)

 

      我只說下具體思路,具體 實現步驟呵呵了

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

 

 

 

 

 

 

         

 

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章