OkHttp實現登陸註冊驗證

首先,添加OkHttp依賴java

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

由於靜態接口須要Java8才能支持使用,咱們要使用靜態接口,須要在build.gradle文件中添加以下配置聲明,使用Java8編譯android

 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

否則會出現以下異常:數據庫

錯誤一:api

   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中添加網絡訪問權限app

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

 

建立OkHttpTools工具類:ide

 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. 獲取響應內容並進行驗證:post

 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接收子線程中的驗證消息並進行處理:gradle

 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
相關文章
相關標籤/搜索