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;@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 之手机客户端登陆相关推荐
- 模仿android新浪微博手机客户端项目
这几天因为事情不多,所以模仿android新浪微博客户端也做了下,虽然后面还有很多功能没有实现(由于时间有限,平时还要上班),所以后面还有很多功能没有实现,不过以后有时间会慢慢做完. 下面发几张截图: ...
- android团购客户端,领团网团购导航Android手机客户端获机锋网力推
近日,领团网(www.lingtuan.com)推出的Android团购导航手机客户端1.1版本登陆国内最具影响力的Android交流平台机锋网,作为国内团购导航权威,领团网手机客户端获机锋网力推,绚 ...
- 淘宝网手机客户端应用开发见解带android版源码下载
淘宝网手机客户端是一个基于Android进行应用的项目,通过该客户端实现了注册功能 .登陆.分页展示商品列表.能够对商品按名称进行模糊查询.能够对商品进行管理 .能够对商品按价格排序.可以查看商品详细 ...
- 基于Android的淘宝网手机客户端开发见解(配完整视频教程讲解)
淘宝网手机客户端是一个基于Android进行应用的项目,通过该客户端实现了注册功能.登陆.分页展示商品列表.能够对商品按名称进行模糊查询.能够对商品进行管理.能够对商品按价格排序.可以查看商品详细信息 ...
- 乐视android版本怎么升级,乐视网android手机客户端升级推出V2.0版
乐视网 android手机客户端V2.0版--"乐视影视"正式发布,据乐视网运营副总裁高飞介绍,"V2.0版是早期发布的乐视网android手机客户端V1.5版的升级版本 ...
- 21cn企业邮箱服务器端口号,21cn企业邮箱手机客户端设置--Android
Android用户可通过Android自带客户端,浏览器以及下载21CN手机邮三种方式访问21CN企业邮箱 客户端设置: 谷歌Android操作系统除了有GMail外还包含了一个强大的E-Mail电子 ...
- Android开发实例-Android平台手机新闻客户端
Android开发实例<Android平台手机新闻客户端>是基于Android4.0及以上平台的一款新闻类手机应用,应用运行效果如下所示: Android开发实例课程主要介绍运行于Andr ...
- Android之使用HttpPost提交数据到服务器(Android手机客户端和后台服务器交互)
这是一个小型的数据交互案例,即Android手机客户端和后台服务器交互(数据库mysql) 服务器端 首先服务器端数据库(用户名root密码123456),db_student.sql数据库表user ...
- 完美高仿精仿京东商城手机客户端android版源码
转自http://blog.csdn.net/xiaocnblogs/article/details/45815445, 完美高仿精仿京东商城手机客户端android版源码,喜欢的朋友可以下载吧. 源 ...
最新文章
- flume java_Flume的安装及简单的使用(一)
- Linux IO路径图
- gerrit的使用和配置
- 在 xml 视图里指定 SAP UI5 VizType 实例
- linux如何挂载U盘
- 学术圈「超级内卷」:“青椒”难!
- Android 8.0 系统学习(6)---Linux内核接口要求
- ERP项目实施记录08
- 【LeetCode 剑指offer刷题】发散思维题2:43 n个骰子的点数
- 黑马程序员 Python学习笔记之 算数运算符
- accept - 指示打印系统接受发往指定目标打印机的打印 任务
- python多项式求导_OO博客作业1:多项式求导作业总结
- 东南大学计算机学院保研比例,江苏省高校保研率排行榜,南京大学第1,保研率超过1/3...
- 什么蓝牙耳机好?测评达人精选五款性价比高蓝牙耳机推荐
- 苹果微信换行怎么打_微信空白朋友圈怎么发?安卓苹果双平台教程
- python页面转图片_网页转图片_技术分享 - SegmentFault 思否
- 网站导航:如何在线生成自定义的二维码?(要美观不要俗气)
- 优秀自我简介200字_个人简历自我评价200字优秀范文.doc
- marlin的源码分析
- 计算机教室着火教师要赔偿多少钱,学校计算机教室进行整修,要铺设静电地板,教室长12、5米,宽7、2米,如果工本费是每平方米108元...
热门文章
- Mac微信多开与微信防撤回分享
- Python 利用多线程进行爬虫(一)
- linux cpu降频怎么设置,Android系统修改CPU降频温度阈值、修改CPU关内核温度阈值的方法...
- Android招聘心得分享
- Horizon Culling 地平线踢出法
- “似水无形” 的小程序化
- CAD/CASS依据等高线等距或随机加高程点插件(等高线等距加高程点、等高线随机加高程点、等高线手动加高程点)
- RDS电台 TA 与 AF解释
- 高德地图覆盖自定义瓦片图
- 安卓上通过pydorid 3来使用jupyter notebook(鸿蒙/华为/安卓手机/平板进行python编程学习)