Android客戶端與Tomcat伺服器通訊實現登入驗證
阿新 • • 發佈:2019-01-30
一.功能描述
在Android客戶端實現登入介面,當將使用者名稱和密碼填入文字框並點選登入按鈕時,將認證資訊傳送至Tomcat伺服器進行認證,若使用者名稱和密碼匹配,則Android客戶端提示登入成功,否則提示登陸失敗。
二.開發環境
Android客戶端:Android Studio2.2.3
伺服器端:MyEclipse2016 + Tomcat9.0
三.詳細過程
(1)Android客戶端的開發
①
新建一個名為LoginGuest的工程,該工程只包含LoginActivity和LoginToServer兩個類,其中LoginToServer物件在LoginActivity中被呼叫,實現向伺服器的資訊傳遞。在
實現LoginActivity的佈局檔案activity_login.xml的佈局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_login" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.leidong.guesttest.LoginActivity" android:orientation="vertical"> <TextView android:text="登入介面" android:textSize="40dp" android:textColor="#003399" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView1" android:gravity="center_horizontal" android:layout_margin="10dp"/> <TextView android:text="使用者名稱~~~~~~~~~~~~~~~~~~~" android:textSize="20dp" android:textColor="#CC0000" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView2" android:layout_margin="10dp"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/et_username" android:textSize="20dp" android:textColor="#003399" android:layout_margin="10dp"/> <TextView android:text="密碼 ~~~~~~~~~~~~~~~~~~~~" android:textSize="20dp" android:textColor="#CC0000" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView3" android:layout_margin="10dp"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/et_password" android:textSize="20dp" android:textColor="#003399" android:layout_margin="10dp"/> <Button android:text="登入" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/bt_login" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="#0099FF"/> </LinearLayout>
效果如下:
②
寫GuestToServer類
注意Android6.0之後SDK不支援HttpClient,此時需要在build.gradle中的android{......}中package com.example.leidong.loginguest; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; /** * Created by leido on 2017/2/15. */ public class GuestToServer { //由於Tomcat伺服器部署在本地,url為本地Tomcat服務的url,IP地址為本地主機IP地址 private String url = "http://XXX.XXX.XXX.XXX:8080/LoginServer/LoginServlet"; //伺服器返回的結果 String result = ""; /** * 使用Post方式向伺服器傳送請求並返回響應 * @param username 傳遞給伺服器的username * @param password 傳遞給伺服器的password * @return */ public String doPost(String username, String password) throws IOException { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); //將username與password引數裝入List中 NameValuePair param1 = new BasicNameValuePair("username", username); NameValuePair param2 = new BasicNameValuePair("password", password); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(param1); params.add(param2); //將引數包裝如HttpEntity中並放入HttpPost的請求體中 HttpEntity httpEntity = new UrlEncodedFormEntity(params, "GBK"); httpPost.setEntity(httpEntity); HttpResponse httpResponse = httpClient.execute(httpPost); //如果響應成功 if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //得到資訊體 HttpEntity entity = httpResponse.getEntity(); InputStream inputStream = entity.getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); String readLine = null; while((readLine = br.readLine()) != null){ result += readLine; } inputStream.close(); return result; } //響應失敗 else{ return "Error"; } } }
加入如下程式碼:
③
寫LoginActivity類
package com.example.leidong.loginguest;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
public class LoginActivity extends AppCompatActivity {
//登入使用者名稱輸入框
private EditText et_username;
//登入密碼輸入框
private EditText et_password;
//登入按鈕
private Button bt_login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//獲取元件
init();
//對登入按鈕的點選監控
bt_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Handler myHandler = new Handler(){
public void handleMessage(Message msg){
String responseResult = (String)msg.obj;
//登入成功
if(responseResult.equals("true")){
Toast.makeText(LoginActivity.this, "登入成功!", Toast.LENGTH_LONG).show();
}
//登入失敗
else{
Toast.makeText(LoginActivity.this, "登入失敗!", Toast.LENGTH_LONG).show();
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
GuestToServer guestToServer = new GuestToServer();
try {
String result = guestToServer.doPost(et_username.getText().toString().trim(), et_password.getText().toString().trim());
Message msg = new Message();
msg.obj = result;
myHandler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
/**
* 獲取元件
*/
private void init() {
et_username = (EditText)findViewById(R.id.et_username);
et_password = (EditText)findViewById(R.id.et_password);
bt_login = (Button)findViewById(R.id.bt_login);
}
}
(2)MyEclipse、Tomcat伺服器端的開發
①
新建一個Java Web工程,新建一個名為LoginServlet的Servlet, 修改器deGet()方法,,程式碼如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String password = request.getParameter("password");
if("hahaha".equals(username) && "123456".equals(password)){
out.print(true);
}
else{
out.print(false);
}
}
預設的正確使用者名稱為hahaha,正確密碼為123456②
此時開啟伺服器在後臺看到其已經執行
四.執行結果
(1)輸入錯誤的使用者名稱或密碼
(2)輸入正確的使用者名稱和密碼