android 之手机客户端登陆

今天要学的例子是通过android 手机客户端登陆到服务器。验证是否登陆成功。

首先:我们在myEclipse 中新建一个web项目提供手机客户端的登陆请求,并做出响应,我们使用struts2.1.8。做一个简单的示例。

这个web服务可以接收post |get 的请求。代码如下:

package com.hkrt.action;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class LoginCheckAction implements Action{  
      
    private String userName;  
    private String password;  
      
    public String execute() throws Exception {  
          
        HttpServletRequest request = ServletActionContext.getRequest();  
        InputStream is = request.getInputStream();
        byte [] result = readIS(is);
        if(result.length>0){
        	 Map<String,String> resuestMap = getRequestParams(new String(result));
             if(!resuestMap.isEmpty()){
             	 userName = resuestMap.get("userName");
             	 password = resuestMap.get("password");
             }	
        }else{
        	  userName = request.getParameter("userName");  
              password = request.getParameter("password");  
        }
        System.out.println("userName:"+userName+"\tpassword:"+password);
        HttpServletResponse response = ServletActionContext.getResponse();  
        OutputStream os = response.getOutputStream();    
        if(!"zs".equals(userName) || !"123".equals(password)){  
            os.write(new String("-1").getBytes());  
        } else {  
            os.write(new String("1").getBytes());  
        }  
          
        response.setStatus(HttpServletResponse.SC_OK);  
        System.out.println("数据访问");
        
      
        return null;  
  
    }  
    public static byte[] readIS(InputStream is) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		byte[] buff = new byte[1024];
		int length = 0;
		while ((length = is.read(buff)) != -1) {
			bos.write(buff, 0, length);
		}
		return bos.toByteArray();
	}
    // 以Post 请求时,返回请求一个map的请求参数
    private Map<String,String> getRequestParams(String requestStr){
    	Map<String,String> maps = new HashMap<String, String>();
		String [] strs = requestStr.split("&");
		List<String> list = new ArrayList<String>();
		for(String st:strs){
			list.add(st);
		}
		for(String lis:list){
			maps.put(lis.split("=")[0],lis.split("=")[1]);
		}
		return maps;
    }

    public String getUserName() {  
        return userName;  
    }  
  
    public void setUserName(String userName) {  
        this.userName = userName;  
    }  
  
    public String getPassword() {  
        return password;  
    }  
  
    public void setPassword(String password) {  
        this.password = password;  
    } 
}

配置strus.xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="default" namespace="/actions" extends="struts-default">
        <!-- 登陆 action -->
	    <action name="LoginCheckAction" class="com.hkrt.action.LoginCheckAction"/>
    </package>
</struts>

现在服务器代码就写完了,没有与数据库进行交互。

以下。我们实现android 客户端登陆的代码:

页面如下:很难看...


代码实现的功能:记录用户名和密码,以get或post 方式请求服务。线程之间的数据交互,对UI进行绘制。

package com.hkrt.activity;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import com.hkrt.R;

public class LoginUserActivity extends Activity {
   private static final String TAG_POST = "post 请求";
   private EditText userNameEdit,passwordEdit;
   private CheckBox checkPwd;//记录密码
   private ImageButton login;//登陆按钮
   private   SharedPreferences sharedPreferences ;//保存用户名和密码的文件
   private Editor editor;//编辑
   private ProgressDialog proDialog;  //进度条
   private Handler loginHandler;//信息处理机
   private String userName;
   private String password;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login_user_activity);
		initView();
		remberMe();
		login.setOnClickListener(submitListener);
		loginHandler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				Bundle bundle = msg.getData();
				boolean loginResult = (Boolean)bundle.get("isNetError");//只获取登陆失败
				 if(proDialog != null){  
		                proDialog.dismiss();  
		            }
				    boolean isNet =  isNetWorkAvailable(LoginUserActivity.this);
				    if(!isNet){
				    	   Toast.makeText(LoginUserActivity.this, "当前网络不可用",  Toast.LENGTH_SHORT).show(); 
				    }
		            if(!loginResult) {  
		            	 Toast.makeText(LoginUserActivity.this, "错误的用户名或密码",  Toast.LENGTH_SHORT).show();  
		            }  
				super.handleMessage(msg);
			}
			
		};
		
		
	}
	//查测网络是否连接 需要添加连网权限 返回true 表示联网 返回false 表示没有联网  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	public static boolean isNetWorkAvailable(Context context) {  
         ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo info = cm.getActiveNetworkInfo();  
        return info != null && info.isConnected();  
       
    } 
	//初始化UI组件
	private void initView(){
		userNameEdit = (EditText)this.findViewById(R.id.username_edit);
		passwordEdit = (EditText)this.findViewById(R.id.password_edit);
		checkPwd = (CheckBox)this.findViewById(R.id.checkPwd);
		login = (ImageButton)this.findViewById(R.id.login);
	}
	//记录密码
	private void remberMe(){
		sharedPreferences= getSharedPreferences("login",Context.MODE_PRIVATE);
		editor = sharedPreferences.edit();//获取编辑器  
		
		String userName = 	sharedPreferences.getString("name","");
		String pwd = 	sharedPreferences.getString("pwd","");
		userNameEdit.setText(userName);
		passwordEdit.setText(pwd);
		if(userName!=null && !userName.equals("")){
			checkPwd.setChecked(true);
		}
	}
	 //登陆事件
	   private OnClickListener submitListener = new OnClickListener() {  
		      
	        public void onClick(View v) {  
	        	userName = userNameEdit.getText().toString();
	        	password=passwordEdit.getText().toString();
	        	if(checkPwd.isChecked()){
					// 编辑配置  
					editor.putString("name",userName);  
					editor.putString("pwd",password);  
					editor.commit();//提交修改  
				}else{
					editor.putString("name",null);  
					editor.putString("pwd", null);  
					editor.commit();//提交修改  
				}
	        	    proDialog = ProgressDialog.show(LoginUserActivity.this,"请稍候","正在登陆...", true, true); 
				    Thread loginThread = new Thread(new LoginFailureHandler());  
		            loginThread.start();  
	        }  
	    };
	    
	 // 验证是否登陆成功
	private class LoginFailureHandler implements Runnable{

		@Override
		public void run() {
			 boolean loginState = loginActionMethodPost(userName,password);
			 if(loginState){
					 Intent intent = new Intent(LoginUserActivity.this,LoginUserSuccessActivity.class);
					 Bundle bun = new Bundle();
					 bun.putString("userName",userName);
					 bun.putString("password",password);
					 intent.putExtras(bun);
					 startActivity(intent);
			    	proDialog.dismiss();  
			 }else{
					Message message = new Message();
					Bundle bundle = new Bundle();  
		            bundle.putBoolean("isNetError",loginState);  
		            message.setData(bundle);  
					loginHandler.sendMessage(message);  
					 
			 }
		}
		
	}
	//请求登陆 get 方式 
	private boolean loginActionMethodGet(String name,String pwd){
		BufferedInputStream bufIn  = null;
		boolean login =false;
		   String validateURL="http://10.0.2.2:8080/androidService/actions/LoginCheckAction?userName=" + name + "&password=" +pwd; 
			try {
				URL url = new URL(validateURL);
				HttpURLConnection httpConn =  (HttpURLConnection)url.openConnection();
				httpConn.setConnectTimeout(5000);  
				httpConn.setRequestMethod("GET");     
				httpConn.connect();  
				bufIn = new BufferedInputStream(httpConn.getInputStream());
				if(httpConn.getResponseCode()==HttpURLConnection.HTTP_OK){
					byte [] body = new byte [1];
					bufIn.read(body);
					String loginState  = new String(body);
					if(loginState.equals("1")){ //返回1登陆成功 -1登陆失败
						login =true;
					}else{
						login =false;
					}
				}
				
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				
				if(bufIn!=null){
					try {
						bufIn.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
			return login;
	}
	// 登陆的 post 方式
	private boolean loginActionMethodPost(String name, String pwd) {
		boolean login = false;
		// Post方式请求
		String validateURL = "http://10.0.2.2:8080/androidService/actions/LoginCheckAction";
		// 请求的参数转换为byte数组
		String params;
		try {
			params = "userName=" + URLEncoder.encode(name, "UTF-8") + "&password=" + URLEncoder.encode(pwd,"UTF-8");
			byte[] postData = params.getBytes();
			// 新建一个URL对象
			URL url = new URL(validateURL);
			// 打开一个HttpURLConnection连接
			HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
			// 设置连接超时时间
			urlConn.setConnectTimeout(5 * 1000);
			// Post请求必须设置允许输出
			urlConn.setDoOutput(true);
			// Post请求不能使用缓存
			urlConn.setUseCaches(false);
			// 设置为Post请求
			urlConn.setRequestMethod("POST");
			urlConn.setInstanceFollowRedirects(true);
			// 配置请求Content-Type
			urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencode");
			// 开始连接
			urlConn.connect();
			// 发送请求参数
			DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
			dos.write(postData);
			dos.flush();
			dos.close();
			// 判断请求是否成功
			if (urlConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
				// 获取返回的数据
				byte[] data = readIS(urlConn.getInputStream());
				if(data.length>0){
					String loginState = new String(data);
					if (loginState.equals("1")) {
						login = true;
					}
					Log.i(TAG_POST, "Post请求方式成功,返回数据如下:");
					Log.i(TAG_POST, new String(data, "UTF-8"));
				}
			} else {
				Log.i(TAG_POST, "Post方式请求失败");
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (ProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			
		}

		return login;
	}
	//读取服务器返回的记录  
	public static byte[] readIS(InputStream is) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		byte[] buff = new byte[1024];
		int length = 0;
		while ((length = is.read(buff)) != -1) {
			bos.write(buff, 0, length);
		}
		bos.flush();
		bos.close();
		return bos.toByteArray();
	}

}
注:服务器的请求路径,由127.0.01 改成10.0.2.2 

以上android 客户端登陆代码可以使用apache 公司的HttpClient.代码格式如下:

// 使用Apache 提供的httpClient 发送get 请求
	private boolean loginActionMethodHttpGet(String name,String pwd){
		BufferedInputStream bufIn  = null;
		boolean login =false;
		String validateURL="http://10.0.2.2:8080/androidService/actions/LoginCheckAction?userName=" + name + "&password=" +pwd; 
		HttpGet get = new HttpGet(validateURL);
		HttpClient httpClient = new DefaultHttpClient();
		try {
			HttpResponse httpResponse = httpClient.execute(get);
			HttpEntity entity = httpResponse.getEntity();
			if(entity!=null){
				bufIn = new BufferedInputStream(entity.getContent());
				byte [] body = new byte [1];
				bufIn.read(body);
				String loginState  = new String(body);
				if(loginState.equals("1")){ //返回1登陆成功 -1登陆失败
					login =true;
				}else{
					login =false;
				}
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return login;
	}
	// 使用Apache 提供的httpClient 发送 post 请求
	private boolean loginActionMethodHttpPost(String name,String pwd){
		boolean login =false;
		String validateURL = "http://10.0.2.2:8080/androidService/actions/LoginCheckAction";
		HttpPost httpPost = new HttpPost(validateURL);
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		HttpClient httpClient = new DefaultHttpClient();
		try {
			params.add(new BasicNameValuePair("userName", name));
			params.add(new BasicNameValuePair("password", pwd));
			httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
			HttpResponse httpResponse = httpClient.execute(httpPost);
			if(httpResponse.getStatusLine().getStatusCode()==200){
				String loginState = EntityUtils.toString(httpResponse.getEntity());
				System.out.println("apache post:"+loginState);
				if(loginState.equals("1")){ //返回1登陆成功 -1登陆失败
					login =true;
				}else{
					login =false;
				}
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return login;
	}
	




原文地址:https://www.cnblogs.com/java20130726/p/3218326.html