1. 程式人生 > >Android客戶端與Tomcat伺服器通訊實現登入驗證

Android客戶端與Tomcat伺服器通訊實現登入驗證

一.功能描述

  在Android客戶端實現登入介面,當將使用者名稱和密碼填入文字框並點選登入按鈕時,將認證資訊傳送至Tomcat伺服器進行認證,若使用者名稱和密碼匹配,則Android客戶端提示登入成功,否則提示登陸失敗。

二.開發環境

Android客戶端:Android Studio2.2.3

伺服器端:MyEclipse2016 + Tomcat9.0

三.詳細過程

(1)Android客戶端的開發

    新建一個名為LoginGuest的工程,該工程只包含LoginActivityLoginToServer兩個類,其中LoginToServer物件在LoginActivity中被呼叫,實現向伺服器的資訊傳遞。在

AndroidManifest.xml中新增網路許可權:


 實現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類

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";
        }
    }
}
注意Android6.0之後SDK不支援HttpClient,此時需要在build.gradle中的android{......}中

    

加入如下程式碼:



 ③

寫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)輸入正確的使用者名稱和密碼