android 登陆验证Cookie的应用

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 说明还未登录,此时应该跳转到登陆页面,登陆后才可以进行以后的操作.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值