OkHttp實現登錄注冊驗證


首先,添加OkHttp依賴

  implementation 'com.squareup.okhttp3:okhttp:3.14.2'

因為靜態接口需要Java8才能支持使用,我們要使用靜態接口,需要在build.gradle文件中添加如下配置聲明,使用Java8編譯

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

不然會出現如下異常:

錯誤一:

   Static interface methods are only supported starting with Android N (--min-api 24): java.util.List okhttp3.Dns.lambda$static$0(java.lang.String)
  Message{kind=ERROR, text=Static interface methods are only supported starting with Android N (--min-api 24): 
java.util.List okhttp3.Dns.lambda$static$0(java.lang.String),sources=[Unknown source file], tool name=Optional.of(D8)}

錯誤二:

   Invoke-customs are only supported starting with Android O (--min-api 26)
   Message{kind=ERROR, text=Invoke-customs are only supported starting with Android O (--min-api 26), sources=[Unknown source file], tool name=Optional.of(D8)}

 

在AndroidManifest.xml中添加網絡訪問權限

    <uses-permission android:name="android.permission.INTERNET" />

 

創建OkHttpTools工具類:

 1 public class OkHttpTools {
 2     //創建OkHttpClient對象
 3     private final OkHttpClient client = new OkHttpClient();
 4     //登錄驗證的方法
 5     public String Login(String username,String password){
 6         //創建請求體並傳遞參數
 7         RequestBody formBody = new FormBody.Builder()
 8                 .add("username",username)
 9                 .add("password",password)
10                 .build();
11         //創建Request對象
12         Request request = new Request.Builder()
13                 .url("http://192.168.*.*:8080/LoginUser")
14                 .post(formBody)
15                 .build();
16         //獲取Response對象
17         try (Response response = client.newCall(request).execute()) {
18             //響應成功並返回響應內容
19             if (response.isSuccessful()) {
20                 return response.body().string();
21                 //此時代碼執行在子線程,修改UI的操作使用handler跳轉到UI線程
22             }
23         }catch (Exception e){
24             e.printStackTrace();
25         }
26         //響應失敗返回" "
27         return " ";
28     }
29     //注冊驗證的方法
30     public String Register(String username,String password){
31         RequestBody formBody = new FormBody.Builder()
32                 .add("username",username)
33                 .add("password",password)
34                 .build();
35         Request request = new Request.Builder()
36                 .url("http://192.168.*.*:8080/RegisterUser")
37                 .post(formBody)
38                 .build();
39 
40         try (Response response = client.newCall(request).execute()) {
41             if (response.isSuccessful()) {
42                 return response.body().string();
43             }
44         }catch (Exception e){
45             e.printStackTrace();
46         }
47         return " ";
48     } 
49 }

 

LoginActivity中

1. 獲取響應內容並進行驗證:

 1         // 登錄按鈕的點擊事件
 2         btn_login.setOnClickListener(new View.OnClickListener() {
 3             @Override
 4             public void onClick(View v) {
 5                 //獲取界面的控件
 6                 getEditString();
 7                 //控件的密碼進行加密
 8                 String md5Psw = MD5Utils.md5(psw);
 9                 //從SharedPreferences中根據用戶名獲取密碼
10                 spPsw = readSpw(userName);
11                 if (TextUtils.isEmpty(userName)) {
12                     Toast.makeText(LoginActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show();
13                     return;
14                 } else if (TextUtils.isEmpty(psw)) {
15                     Toast.makeText(LoginActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show();
16                     return;
17                 } else if (true) {
18                     //創建子線程並獲取數據
19                     new Thread() {
20                         @Override
21                         public void run() {
22                             OkHttpTools tools = new OkHttpTools();
23                             String flag="";
24                             //傳遞參數獲取響應內容
25                             String result = tools.Login(userName, psw);
26                             //判斷數據庫查詢出來值是否與輸入的值相等
27                             if (result.equals(userName+psw)){
28                                 flag="success";
29                             }
30                             if (flag.equals("success")) {
31                                 handler.sendEmptyMessage(MSG_SUCCESS);
32                             } else {
33                                 handler.sendEmptyMessage(MSG_FAIL);
34                             }
35                         }
36                     }.start();
37                     return;
38                 } else if (!TextUtils.isEmpty(spPsw) && !md5Psw.equals(spPsw)) {
39                     Toast.makeText(LoginActivity.this, "輸入的用戶名和密碼不一致", Toast.LENGTH_SHORT).show();
40                     return;
41                 } else {
42                     Toast.makeText(LoginActivity.this, "此用戶名不存在", Toast.LENGTH_SHORT).show();
43                     return;
44                 }
45             }
46         });    

 2. Handler接收子線程中的驗證消息並進行處理:

 1     //界面上顯示數據
 2     Handler handler = new Handler() {
 3         @Override
 4         public void handleMessage(Message msg) {
 5             if (msg.what == MSG_SUCCESS) {
 6                 Toast.makeText(LoginActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
 7                 //保存登錄的狀態和用戶名
 8                 saveLoginStatus(true, userName);
 9                 //登錄成功的狀態保存到MainActivity
10                 Intent intent = new Intent();
11                 intent.putExtra("isLogin", true);
12                 setResult(RESULT_OK, intent);
13                 LoginActivity.this.finish();
14             }else {
15                 Toast.makeText(LoginActivity.this, "登錄失敗", Toast.LENGTH_SHORT).show();
16             }
17         }
18     };

 

RegisterActivity中

1. 獲取響應內容並進行驗證:

 1         //注冊按鈕的點擊事件
 2         btn_register.setOnClickListener(new View.OnClickListener() {
 3             @Override
 4             public void onClick(View v) {
 5                 //獲取輸入到控件的值
 6                 getEditString();
 7                 if (TextUtils.isEmpty(userName)) {
 8                     Toast.makeText(RegisterActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show();
 9                     return;
10                 } else if (TextUtils.isEmpty(psw)) {
11                     Toast.makeText(RegisterActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show();
12                     return;
13                 } else if (TextUtils.isEmpty(pswAgain)) {
14                     Toast.makeText(RegisterActivity.this, "請輸入確認密碼", Toast.LENGTH_SHORT).show();
15                     return;
16                 } else if (!psw.equals(pswAgain)) {
17                     Toast.makeText(RegisterActivity.this, "確認密碼和密碼不一致", Toast.LENGTH_SHORT).show();
18                     return;
19                 } else {
20                     new Thread() {
21                         @Override
22                         public void run() {
23                             OkHttpTools tools = new OkHttpTools();
24                             String result = tools.Register(userName, psw);
25                             if (result.equals("success")) {
26                                 handler.sendEmptyMessage(MSG_SUCCESS);
27                             } else if (result.equals(userName)) {
28                                 handler.sendEmptyMessage(MSG_REPEAT);
29                             } else {
30                                 handler.sendEmptyMessage(MSG_FAIL);
31                             }
32                         }
33                     }.start();
34                     return;
35                 }
36             }
37         });    

 2. Handler接收子線程中的驗證消息並進行處理:

 1     Handler handler = new Handler() {
 2         @Override
 3         public void handleMessage(Message msg) {
 4             if (msg.what == MSG_SUCCESS) {
 5                 Toast.makeText(RegisterActivity.this, "注冊成功", Toast.LENGTH_SHORT).show();
 6                 //把用戶名和密碼保存到SharedPreferences中
 7                 saveRegisterInfo(userName, psw);
 8                 //把注冊成功的用戶名傳到LoginActivity
 9                 Intent data = new Intent();
10                 //要傳的用戶名
11                 data.putExtra("userName", userName);
12                 setResult(RESULT_OK, data);
13                 RegisterActivity.this.finish();
14             } else if (msg.what == MSG_REPEAT) {
15                 Toast.makeText(RegisterActivity.this, "此用戶名已存在", Toast.LENGTH_SHORT).show();
16             } else {
17                 Toast.makeText(RegisterActivity.this, "注冊失敗", Toast.LENGTH_SHORT).show();
18             }
19         }
20     };

 

Web項目中獲取請求,進行數據處理並返回響應結果:

UserController:

 1 @Controller
 2 public class UserController {
 3     //注入userService
 4     @Autowired
 5     private UserService userService;
 6     //處理用戶登錄的方法
 7     @RequestMapping("/LoginUser")
 8     public void LoginUser(HttpServletRequest request,HttpServletResponse response) throws IOException {
 9         //設置響應編碼
10         response.setCharacterEncoding("UTF-8");
11         PrintWriter out = response.getWriter();
12         //獲取請求的用戶名和密碼
13         String username = request.getParameter("username");
14         String password = request.getParameter("password");
15         //對用戶名和密碼進行拼接
16         String user= username+password;
17         //從數據庫中獲取全部數據
18         List<User> users = userService.findUsers();
19         //存放從數據庫中獲取的全部數據
20         List<String> userList = new ArrayList<>();
21         for (User u:users){
22             String info = u.getUsername()+u.getPassword();
23             userList.add(info);
24         }
25         //判斷集合中是否含有獲取的數據
26         if (userList.contains(user)){
27             System.out.println("true");
28             out.write(user);
29         }else {
30             System.out.println("false");
31             out.write("fail");
32         }
33 
34     }
35     //處理用戶注冊的方法
36     @RequestMapping("/RegisterUser")
37     public void RegisterUser(HttpServletRequest request,HttpServletResponse response) throws IOException {
38         //設置響應編碼
39         response.setCharacterEncoding("UTF-8");
40         PrintWriter out = response.getWriter();
41         //獲取請求信息
42         String username = request.getParameter("username");
43         String password = request.getParameter("password");
44         //進行注冊之前先判斷數據庫中是否含有該用戶名
45         //查詢全部信息並把信息添加到集合中,以備驗證用戶名是否存在
46         List<User> users = userService.findUsers();
47         List<String> userList = new ArrayList<>();
48         for (User u:users){
49             String name = u.getUsername();
50             userList.add(name);
51         }
52         //判斷是否含有該用戶
53         if (!userList.contains(username)){
54             //不含有該用戶名向數據庫中添加信息
55             User user = new User();
56             user.setUsername(username);
57             user.setPassword(Integer.parseInt(password));
58             //向數據庫中插入數據
59             int row = userService.insertUser(user);
60             if (row>0){
61                 out.write("success");
62             }else {
63                 System.out.println("信息添加失敗");
64                 out.write("fail");
65             }
66         }else if (userList.contains(username)){
67             //含有該用戶名把用戶名返回
68             out.write(username);
69         }else {
70             out.write("fail");
71         }
72     }
73 }
74     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM