android 之手机客户端登陆
16lz
2021-01-23
今天要学的例子是通过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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login_user_activity);initView();remberMe();login.setOnClickListener(submitListener);loginHandler = new Handler(){@Overridepublic 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{@Overridepublic 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-TypeurlConn.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;}
更多相关文章
- Android JAVA代码执行shell命令
- 〖Android〗OK6410a的Android HAL层代码编写笔记
- android 多个shortCut快捷方式实现以及对58同城快捷方式的实现思
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行
- Android应用数据存储几种方式(1)
- android recovery 主系统代码分析