您的位置:首页 > 移动开发 > Android开发

android 登陆验证Cookie的应用

2014-06-26 16:25 176 查看
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;
}

}


执行AsycTasker代码:

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 说明还未登录,此时应该跳转到登陆页面,登陆后才可以进行以后的操作.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: