日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 扫码登录案例

發布時間:2023/12/20 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 扫码登录案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先不妨先看下Android:掃描二維碼登陸原理:

大概總結下這個過程就是:

  • 服務器生成全局唯一會話ID,并返回二維碼、過期時間;
  • 用戶掃描二維碼,提交改會話ID,用戶基本信息到服務器;
  • PC端在過期時間內一直輪詢,如果用戶掃碼,服務器記錄狀態,PC端跳轉到已登錄頁面;
  • 那不妨按照這個思路來寫一個簡單的Demo。

    1. 后臺

    首先,我們需要搭建一個簡易版的后臺。在IDEA中創建SpringBoot項目,然后添加thymeleaf和session的依賴:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-core</artifactId> </dependency>

    然后,我們這里模擬Demo,不需要數據庫,故而模擬系統中已注冊用戶,可以使用Set集合來存儲。模擬記錄系統登錄用戶來使用Map存儲。然后將之封裝到一個Bean對象中。同樣二維碼這里也直接使用一張靜態二維碼,內容為:

    http://192.168.1.102:8080/scanlogin?uuid=Wxfsfdfskfj== @Component public class UserMap {private static Map<String, User> loginmap = new HashMap<String, User>();private static Set<User> users = new HashSet<>();

    項目結構如下:

    添加對應的html頁面,在loginpage.html中顯示二維碼,并進行輪詢:

    <body><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script><center><div>login page!</div><img src="code.png" style="width=300px; height=300px;"><div style="color:red;" id="info"></div></center><script>var getting = {url:'http://192.168.1.102:8080/checkscan',data:{"uuid": "Wxfsfdfskfj=="},dataType:'text',success:function(res) {if(JSON.parse(res)){$('#info').html("已授權");setTimeout(function(){window.location.href = 'http://192.168.1.102:8080/home';},1000);}else{$('#info').html("未授權");}setTimeout(function(){$.ajax(getting);},1000);},error:function(res){$('#info').html("請求發生了未知錯誤!");}};$.ajax(getting)</script> </body> </html>

    然后就是Controller的Android端掃碼后確認授權接口:

    @GetMapping(value="/scanlogin") @ResponseBody // 手機端確定登錄后調用該接口,將用戶加入到登錄Map // http://localhost:8080/login?uuid=Wxfsfdfskfj==&userid=qwe&username=123 public String scanLogin(HttpSession session,@RequestParam("uuid") String uuid,@RequestParam("userid") String userid,@RequestParam("username") String name){String UUID = "Wxfsfdfskfj==";User user = new User(name, userid);if(uuid.equals(UUID) && userService.checkUserInfo(user)){UserMap.loginUser(UUID, new User(name, userid));return "SUCCESS LOGIN!";}else {return "ERROR UserInfo!";} }

    在請求主頁home的時候,需要判斷用戶是否登錄,即校驗Session。

    @GetMapping(value="/home") // 校驗Session的主頁 public String getHomePage(HttpSession session){String username = (String) session.getAttribute("name");if(username == null){return "redirect:/notlogin";}return "homepage"; }

    前端ajax輪詢接口:

    @GetMapping(value="/checkscan") @ResponseBody // 需要前端輪詢這個接口,判斷是否確認登錄 public boolean hasScan(HttpSession session,@RequestParam("uuid") String uuid){User scanedUser = UserMap.getScanUserByUUID(uuid);if(scanedUser == null)return false;if(userService.hasUser(scanedUser.getUserID())){String username = (String) session.getAttribute("name");if(username == null){session.setAttribute("name", uuid);}return true;}return false; }

    2. Android端

    首先添加兩個依賴:

    implementation 'cn.yipianfengye.android:zxing-library:2.2' implementation 'com.squareup.okhttp3:okhttp:3.2.0'

    zxing是一個使用非常簡單的掃碼封裝。項目地址:here

    按照文檔說明進行集成即可。頁面非常簡單,兩個頁面:
    MainActivity中顯示一個按鈕,模擬掃碼入口,調用后掃碼后返回結果;

    LoginActivity中進行提示用戶確認授權,進行確認接口請求;

    MainActivity中添加權限申請:

    <uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.INTERNET" /> // 請求讀寫權限 if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {//申請權限ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, 1); } if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {//申請權限ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.INTERNET}, 1); }

    進行點擊按鈕的跳轉

    Intent intent = new Intent(MainActivity.this, CaptureActivity.class); startActivityForResult(intent, 1);

    復寫onActivityResult方法(CaptureActivity中調用setResult,然后finish()):

    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {//處理掃描結果(在界面上顯示)super.onActivityResult(requestCode, resultCode, data);if(requestCode == 1){Toast.makeText(this, String.valueOf(null != data), Toast.LENGTH_LONG).show();if (null != data) {Bundle bundle = data.getExtras();if (bundle == null) {return;}if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {String result = bundle.getString(CodeUtils.RESULT_STRING);Intent intent = new Intent(MainActivity.this, LoginActivity.class);intent.putExtra("url", result);startActivity(intent);} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {Toast.makeText(MainActivity.this, "解析二維碼失敗", Toast.LENGTH_LONG).show();}}} }

    在啟動的LoginActivity中進行確認授權接口進行GET請求:

    public void requestLogin() {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(url).build();client.newCall(request).enqueue(new Callback() {Message msg = new Message();@Overridepublic void onFailure(Call call, IOException e) {msg.obj="請求失敗";handler.sendMessage(msg);}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {if (response.code() == 200) {String result = response.body().string();if(result.equals("SUCCESS LOGIN!")){msg.obj = "授權成功!";}}}else{msg.obj = "出現了未知錯誤: " + response.code();}handler.sendMessage(msg);}}); }

    3. 效果:

    掃碼前,我們直接home;掃碼后Ajax處理直接跳轉到主頁home。

    Demo地址

    https://github.com/baiyazi/ScanQrCodeAndAutoLoginDemo

    總結

    以上是生活随笔為你收集整理的Android 扫码登录案例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。