Android 扫码登录案例
首先不妨先看下Android:掃描二維碼登陸原理:
大概總結下這個過程就是:
那不妨按照這個思路來寫一個簡單的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中添加權限申請:
進行點擊按鈕的跳轉
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 扫码登录案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 值得推荐的51.com产品设计实践(值得
- 下一篇: Android 用于视频回放显示时间刻度