AsyncHttpClient登录保存cookie和读写cookie

2015年9月22日 由 Creater 留言 »

写Cookie的场景
比如登录。在用户首次登录成功的时候,我们会从服务端取得Cookie,存储在用户手机的本地文件中。在用户下次打开应用时,会首先读取本地Cookie,Cookie没有过期的话,直接引导用户到相应界面,不再进行登录。

读Cookie的场景
除了登录之外,还有某些特殊的服务器请求,需要将本地Cookie信息一起发给服务端。
AsyncHttpClient会获取到你的cookies然后自动保存到你的首选项中,这时候只需要我们手动set一下即可,这样就保持了和服务端的session一致问题,也不会导致出现401权限错误,代码如下:

PersistentCookieStore myCookieStore = new PersistentCookieStore(this);  
client.setCookieStore(myCookieStore); 

测试代码:

package com.example.cookietest;

import java.util.List;

import org.apache.http.Header;
import org.apache.http.client.CookieStore;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HttpContext;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.cookietest.LoginManager.ICallBack;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.PersistentCookieStore;
import com.loopj.android.http.RequestParams;
public class MainActivity extends Activity implements OnClickListener {
	private final String TAG = "MainActivity";
	//用户名
	EditText etUserName;
	// 密码
	EditText etPwd;
	// 登录按钮
	Button btnLogin;
	// 取消按钮
	Button btnCancel;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
		App app = (App) this.getApplication();
		app.mContext = getApplicationContext();
		
	}

	private void init() {
		etUserName = (EditText) findViewById(R.id.etUserName);
		etPwd = (EditText) findViewById(R.id.etPwd);
		btnLogin = (Button) findViewById(R.id.btnLogin);
		btnCancel = (Button) findViewById(R.id.btnCancel);
		btnLogin.setOnClickListener(this);
		btnCancel.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.btnLogin:
			/*new LoginManager().login(etUserName.getText().toString(), etPwd.getText().toString(), new ICallBack() {
				
				@Override
				public void onSuccess() {
					// TODO Auto-generated method stub
					Toast.makeText(App.mContext, "登录成功,cookie=" + Util.getPreference("cookie"), Toast.LENGTH_SHORT).show();
					startActivity(new Intent(MainActivity.this, GetVideoListActivity.class));
				}
				
				@Override
				public void onFailed(String error) {
					// TODO Auto-generated method stub
					Toast.makeText(App.mContext, error, Toast.LENGTH_SHORT).show();
				}
			});*/
			login(etUserName.getText().toString(), etPwd.getText().toString());
			break;

		case R.id.btnCancel:
			this.finish();
			break;
		default:
			break;
		}
	}
	
	private void login(String username, String password){
		String url = URLContainer.getLoginUrl(
				username, password);
		final AsyncHttpClient client = new AsyncHttpClient();
		
		//保存cookie,自动保存到了shareprefercece
		PersistentCookieStore myCookieStore = new PersistentCookieStore(MainActivity.this);  
        client.setCookieStore(myCookieStore);
        

		client.post(url, new AsyncHttpResponseHandler() {

			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] errorResponse, Throwable e) {
				Log.e(TAG, "获取数据异常 ", e);
			}

			@Override
			public void onSuccess(int statusCode, Header[] headers, byte[] response) {
				String json = new String(response);
				Log.d(TAG, "onSuccess json = " + json);
				
			
				//测试获得已经保存的cookie
				Toast.makeText(App.mContext, "登录成功,cookie=" + getCookieText(), Toast.LENGTH_SHORT).show();
				startActivity(new Intent(MainActivity.this, GetVideoListActivity.class));
			}
			
		});
		
	}
	
	
	/**
	 * 获取标准 Cookie  
	 */
	private String getCookieText() {
		PersistentCookieStore myCookieStore = new PersistentCookieStore(MainActivity.this);
		List<Cookie> cookies = myCookieStore.getCookies();
		Log.d(TAG, "cookies.size() = " + cookies.size());
		Util.setCookies(cookies);
		for (Cookie cookie : cookies) {
			Log.d(TAG, cookie.getName() + " = " + cookie.getValue());
		}
		 StringBuffer sb = new StringBuffer();
		for (int i = 0; i < cookies.size(); i++) {
			 Cookie cookie = cookies.get(i);
			 String cookieName = cookie.getName();
			 String cookieValue = cookie.getValue();
			if (!TextUtils.isEmpty(cookieName)
					&& !TextUtils.isEmpty(cookieValue)) {
				sb.append(cookieName + "=");
				sb.append(cookieValue + ";");
			}
		}
		Log.e("cookie", sb.toString());
		return sb.toString();
	}
}

自定义FinalAsyncHttpClient(注意:自定义是为了方便使用,每次从服务器请求数据都要带上cookie):

package com.lindo.collector.http;

import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;

import android.content.Context;

import com.lindo.collector.utils.MD5;
import com.lindo.collector.utils.Utils;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.RequestParams;

public class FinalAsyncHttpClient {

	AsyncHttpClient client;
	
	public FinalAsyncHttpClient() {
		client = new AsyncHttpClient();
		client.setConnectTimeout(5);//5s超时
		if (Utils.getCookies() != null) {//每次请求都要带上cookie
			BasicCookieStore bcs = new BasicCookieStore();
			bcs.addCookies(Utils.getCookies().toArray(
					new Cookie[Utils.getCookies().size()]));
			client.setCookieStore(bcs);
		}
	}
	
	public AsyncHttpClient getAsyncHttpClient(){
		return this.client;
	}
	
	
}

请求数据:

private void getJoinedDoingsInfo(String id) {
		
		String url = Constant.USER_JOINED_TASK_INFO_URL;
		FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();
		AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();

		RequestParams params = new RequestParams();
		params.put("task_id", id);
		client.get(url, params, new AsyncHttpResponseHandler() {


			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] responseBody, Throwable error) {

			}

			@Override
			public void onSuccess(int statusCode, Header[] headers, byte[] data) {
				String json = new String(data);
				Log.d(TAG, "onSuccess " + json);
				
			}

		});
	}

Utils.java

public class Utils {

	private static List<Cookie> cookies;

	public static List<Cookie> getCookies() {
		return cookies != null ? cookies : new ArrayList<Cookie>();
	}

	public static void setCookies(List<Cookie> cookies) {
		Utils.cookies = cookies;
	}
}

登陆:

private void login(final String phoneNum, final String userPass) {
		Log.d(TAG, "login userPass = " + userPass);
		String url = Constant.USER_LOGIN_URL;
		FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();
		AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();
		
		saveCookie(client);
        
		RequestParams params = finalAsyncHttpClient.getCommonRequestParams(this);
		params.put("username", phoneNum);
		params.put("pwd", userPass);
		client.post(url, params, new AsyncHttpResponseHandler() {

			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] errorResponse, Throwable e) {
				
			}

			@Override
			public void onSuccess(int statusCode, Header[] headers,
					byte[] response) {
				Log.d(TAG, "onSuccess statusCode = " + statusCode);
				String json = new String(response);
				Utils.setCookies(getCookie());}});}

在登陆时调用的方法:

protected void saveCookie(AsyncHttpClient client) {
		PersistentCookieStore cookieStore = new PersistentCookieStore(this);
		client.setCookieStore(cookieStore);
	}

	protected List<Cookie> getCookie(){
		PersistentCookieStore cookieStore = new PersistentCookieStore(this);
		List<Cookie> cookies = cookieStore.getCookies();
		return cookies;
	}
	
	public void clearCookie(){
		PersistentCookieStore cookieStore = new PersistentCookieStore(this);
		cookieStore.clear();
	}
广告位

发表评论

你必须 登陆 方可发表评论.