android 登陆 的三个难点: 用户验证 -----> 保存账号密码 、保存Cookie -----> 保持用户的登陆状态
获取服务器那边的Cookie:
/**
* 验证用户是否登陆成功.
*/
public class MyAsycTask extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String result = null;
int statusCode = 0;
HttpPost mPost = new HttpPost(url);
try {
DefaultHttpClient client = new DefaultHttpClient();
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
pairs.add(new BasicNameValuePair("username", "wqtest12@ddaidai.com"));
pairs.add(new BasicNameValuePair("password", "111111"));
mPost.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));
HttpResponse httpResponse = client.execute(mPost);
statusCode = httpResponse.getStatusLine().getStatusCode();
// 处理返回的httpResponse信息
if (statusCode == 200) {
result = EntityUtils.toString(httpResponse.getEntity());
JSONObject jsonObject = new JSONObject(result);
int flag = jsonObject.getInt("ret");
if(flag > 0){
Log.e("Test", "登陆成功..");
}else{
Log.e("Test", "登陆失败..");
}
Cookie cookie;
String cookname,cookvalue;
List<Cookie> cookies = client.getCookieStore().getCookies();
if (cookies.isEmpty()) {
Log.e("Test", "-------Cookie NONE---------");
} else {
for (int i = 0; i < cookies.size(); i++) {
cookie = cookies.get(i);
cookname = cookie.getName().trim();
cookvalue = cookie.getValue().trim();
String name = cookname;
String value = cookvalue;
Log.e("Test","name==="+name+" value===="+value+" i======"+i);
}
}
} else
result = "networkerror";
} catch (ConnectTimeoutException e) {// 超时或网络连接出错
result = "timeouterror";
} catch (ClientProtocolException e) {
result = "networkerror";
} catch (Exception e) {
result = "readerror";
Log.e("Test", e.getMessage());
} finally {
mPost.abort();
}
return result;
}
}
new MyAsycTask().execute();
以上是获取服务器端的Cookie( Session),那如何把他 通过Http请求带到服务器端呢?
HttpPost httpPost = new HttpPost(访问地址);
httpPost.setHeader("Cookie", "JSESSIONID=" + 我们在静态变量里存放的SessionId);
HttpResponse httpResponse = httpclient.execute(httpPost); (这里的client一定是和前面的HttpClient对象是同一个)
HttpGet 请求.
HttpGet request = new HttpGet(url+"?"+Params);
request.setHeader("Cookie",Sessionid); <pre name="code" class="html">(这里的client一定是和前面的HttpClient对象是同一个)
如何保持登陆状态呢?
为了在各个activity之间使用一个共通的cookie,需要一个全局变量来解决问题 (判断用户是否登陆)
首先声明一个application类用来存取cookie:
public class myApp extends Application {
private CookieStore cookies;
public CookieStore getCookie(){
return cookies;
}
public void setCookie(CookieStore cks){
cookies = cks;
}
}
另外,要在AndroidManifest.xml文件中将上面声明的这个类绑定到包含所有activity的application上,方法是为application标签加 android:name=".myApp"
这样就可以在Activity中使用这个“全局变量”了:
//设置cookie
myApp appCookie = ((myApp)getApplication());
appCookie.setCookie(cookies);
//读取cookie
myApp appCookie = ((myApp)getApplicationContext());
cookies = appCookie.getCookie();
经过以上的步骤,android程序完成一个Web登录后就可以保持登录的状态了。
如果想控制 还未登陆 某些页面不可以访问 某些页面可以访问,那就判断该次用户的操作是否保存了Session或Cookie.如果保存了,说明已经登陆了,如果为null 说明还未登录,此时应该跳转到登陆页面,登陆后才可以进行以后的操作.