今天要学的例子是通过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; }