首先,添加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