AsyncHttpClient有个特性:
(11)持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中
AsyncHttpClient Cookie相关的官方的文档
This library also includes a PersistentCookieStore
which
is an implementation of the Apache HttpClient CookieStore
interface
that automatically saves cookies to SharedPreferences
storage
on the Android device.
大概意思是将coolies自动保存到了首选项中。
写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;
- //参考文章:http://blog.csdn.net/jdsjlzx/article/details/44632451
- 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();
- }
- }
代码下载:
http://download.csdn.NET/detail/jdsjlzx/8541657
鉴于很多网友对怎么使用还是有疑问,这里再补充下。
自定义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();
- }
在Activity中调用:
- private void getTaskPicTags(final String url){
- Log.d(TAG, "getTaskPicTags url = " + url);
- FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();
- AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();
- RequestParams params = finalAsyncHttpClient.getCommonRequestParams(this);
- client.get(url, params, new AsyncHttpResponseHandler() {
- @Override
- public void onSuccess(int statusCode, Header[] headers,
- byte[] responseBody) {
- String json = new String(responseBody);
- Log.d(TAG, "onSuccess " + json);
- }
- @Override
- public void onFailure(int statusCode, Header[] headers,
- byte[] responseBody, Throwable error) {
- Log.e(TAG, "onFailure " , error);
- }
- });
- }