Android AsyncHttpClient登录保存cookie和读写cookie

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权限错误,代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PersistentCookieStore myCookieStore = new PersistentCookieStore(this);    
  2. client.setCookieStore(myCookieStore);   


测试代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.example.cookietest;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.http.Header;  
  6. import org.apache.http.client.CookieStore;  
  7. import org.apache.http.client.protocol.ClientContext;  
  8. import org.apache.http.cookie.Cookie;  
  9. import org.apache.http.impl.client.DefaultHttpClient;  
  10. import org.apache.http.protocol.HttpContext;  
  11.   
  12. import android.app.Activity;  
  13. import android.content.Intent;  
  14. import android.os.Bundle;  
  15. import android.text.TextUtils;  
  16. import android.util.Log;  
  17. import android.view.View;  
  18. import android.view.View.OnClickListener;  
  19. import android.widget.Button;  
  20. import android.widget.EditText;  
  21. import android.widget.Toast;  
  22.   
  23. import com.example.cookietest.LoginManager.ICallBack;  
  24. import com.loopj.android.http.AsyncHttpClient;  
  25. import com.loopj.android.http.AsyncHttpResponseHandler;  
  26. import com.loopj.android.http.PersistentCookieStore;  
  27. import com.loopj.android.http.RequestParams;  
  28. //参考文章:http://blog.csdn.net/jdsjlzx/article/details/44632451  
  29.   
  30. public class MainActivity extends Activity implements OnClickListener {  
  31.     private final String TAG = "MainActivity";  
  32.     //用户名  
  33.     EditText etUserName;  
  34.     // 密码  
  35.     EditText etPwd;  
  36.     // 登录按钮  
  37.     Button btnLogin;  
  38.     // 取消按钮  
  39.     Button btnCancel;  
  40.   
  41.     @Override  
  42.     public void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.activity_main);  
  45.         init();  
  46.         App app = (App) this.getApplication();  
  47.         app.mContext = getApplicationContext();  
  48.           
  49.     }  
  50.   
  51.     private void init() {  
  52.         etUserName = (EditText) findViewById(R.id.etUserName);  
  53.         etPwd = (EditText) findViewById(R.id.etPwd);  
  54.         btnLogin = (Button) findViewById(R.id.btnLogin);  
  55.         btnCancel = (Button) findViewById(R.id.btnCancel);  
  56.         btnLogin.setOnClickListener(this);  
  57.         btnCancel.setOnClickListener(this);  
  58.     }  
  59.   
  60.     @Override  
  61.     public void onClick(View v) {  
  62.         // TODO Auto-generated method stub  
  63.         switch (v.getId()) {  
  64.         case R.id.btnLogin:  
  65.             /*new LoginManager().login(etUserName.getText().toString(), etPwd.getText().toString(), new ICallBack() { 
  66.                  
  67.                 @Override 
  68.                 public void onSuccess() { 
  69.                     // TODO Auto-generated method stub 
  70.                     Toast.makeText(App.mContext, "登录成功,cookie=" + Util.getPreference("cookie"), Toast.LENGTH_SHORT).show(); 
  71.                     startActivity(new Intent(MainActivity.this, GetVideoListActivity.class)); 
  72.                 } 
  73.                  
  74.                 @Override 
  75.                 public void onFailed(String error) { 
  76.                     // TODO Auto-generated method stub 
  77.                     Toast.makeText(App.mContext, error, Toast.LENGTH_SHORT).show(); 
  78.                 } 
  79.             });*/  
  80.             login(etUserName.getText().toString(), etPwd.getText().toString());  
  81.             break;  
  82.   
  83.         case R.id.btnCancel:  
  84.             this.finish();  
  85.             break;  
  86.         default:  
  87.             break;  
  88.         }  
  89.     }  
  90.       
  91.     private void login(String username, String password){  
  92.         String url = URLContainer.getLoginUrl(  
  93.                 username, password);  
  94.         final AsyncHttpClient client = new AsyncHttpClient();  
  95.           
  96.         //保存cookie,自动保存到了shareprefercece  
  97.         PersistentCookieStore myCookieStore = new PersistentCookieStore(MainActivity.this);    
  98.         client.setCookieStore(myCookieStore);  
  99.           
  100.   
  101.         client.post(url, new AsyncHttpResponseHandler() {  
  102.   
  103.             @Override  
  104.             public void onFailure(int statusCode, Header[] headers,  
  105.                     byte[] errorResponse, Throwable e) {  
  106.                 Log.e(TAG, "获取数据异常 ", e);  
  107.             }  
  108.   
  109.             @Override  
  110.             public void onSuccess(int statusCode, Header[] headers, byte[] response) {  
  111.                 String json = new String(response);  
  112.                 Log.d(TAG, "onSuccess json = " + json);  
  113.                   
  114.               
  115.                 //测试获得已经保存的cookie  
  116.                 Toast.makeText(App.mContext, "登录成功,cookie=" + getCookieText(), Toast.LENGTH_SHORT).show();  
  117.                 startActivity(new Intent(MainActivity.this, GetVideoListActivity.class));  
  118.             }  
  119.               
  120.         });  
  121.           
  122.     }  
  123.       
  124.       
  125.     /** 
  126.      * 获取标准 Cookie   
  127.      */  
  128.     private String getCookieText() {  
  129.         PersistentCookieStore myCookieStore = new PersistentCookieStore(MainActivity.this);  
  130.         List<Cookie> cookies = myCookieStore.getCookies();  
  131.         Log.d(TAG, "cookies.size() = " + cookies.size());  
  132.         Util.setCookies(cookies);  
  133.         for (Cookie cookie : cookies) {  
  134.             Log.d(TAG, cookie.getName() + " = " + cookie.getValue());  
  135.         }  
  136.          StringBuffer sb = new StringBuffer();  
  137.         for (int i = 0; i < cookies.size(); i++) {  
  138.              Cookie cookie = cookies.get(i);  
  139.              String cookieName = cookie.getName();  
  140.              String cookieValue = cookie.getValue();  
  141.             if (!TextUtils.isEmpty(cookieName)  
  142.                     && !TextUtils.isEmpty(cookieValue)) {  
  143.                 sb.append(cookieName + "=");  
  144.                 sb.append(cookieValue + ";");  
  145.             }  
  146.         }  
  147.         Log.e("cookie", sb.toString());  
  148.         return sb.toString();  
  149.     }  
  150. }  

代码下载:

http://download.csdn.NET/detail/jdsjlzx/8541657


鉴于很多网友对怎么使用还是有疑问,这里再补充下。


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

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.lindo.collector.http;  
  2.   
  3. import org.apache.http.cookie.Cookie;  
  4. import org.apache.http.impl.client.BasicCookieStore;  
  5.   
  6. import android.content.Context;  
  7.   
  8. import com.lindo.collector.utils.MD5;  
  9. import com.lindo.collector.utils.Utils;  
  10. import com.loopj.android.http.AsyncHttpClient;  
  11. import com.loopj.android.http.RequestParams;  
  12.   
  13. public class FinalAsyncHttpClient {  
  14.   
  15.     AsyncHttpClient client;  
  16.       
  17.     public FinalAsyncHttpClient() {  
  18.         client = new AsyncHttpClient();  
  19.         client.setConnectTimeout(5);//5s超时  
  20.         if (Utils.getCookies() != null) {//每次请求都要带上cookie  
  21.             BasicCookieStore bcs = new BasicCookieStore();  
  22.             bcs.addCookies(Utils.getCookies().toArray(  
  23.                     new Cookie[Utils.getCookies().size()]));  
  24.             client.setCookieStore(bcs);  
  25.         }  
  26.     }  
  27.       
  28.     public AsyncHttpClient getAsyncHttpClient(){  
  29.         return this.client;  
  30.     }  
  31.       
  32.       
  33. }  


请求数据:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private void getJoinedDoingsInfo(String id) {  
  2.           
  3.         String url = Constant.USER_JOINED_TASK_INFO_URL;  
  4.         FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();  
  5.         AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();  
  6.   
  7.         RequestParams params = new RequestParams();  
  8.         params.put("task_id", id);  
  9.         client.get(url, params, new AsyncHttpResponseHandler() {  
  10.   
  11.   
  12.             @Override  
  13.             public void onFailure(int statusCode, Header[] headers,  
  14.                     byte[] responseBody, Throwable error) {  
  15.   
  16.             }  
  17.   
  18.             @Override  
  19.             public void onSuccess(int statusCode, Header[] headers, byte[] data) {  
  20.                 String json = new String(data);  
  21.                 Log.d(TAG, "onSuccess " + json);  
  22.                   
  23.             }  
  24.   
  25.         });  
  26.     }  


Utils.Java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class Utils {  
  2.   
  3.     private static List<Cookie> cookies;  
  4.   
  5.     public static List<Cookie> getCookies() {  
  6.         return cookies != null ? cookies : new ArrayList<Cookie>();  
  7.     }  
  8.   
  9.     public static void setCookies(List<Cookie> cookies) {  
  10.         Utils.cookies = cookies;  
  11.     }  
  12.   
  13.       
  14. }  


登陆:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private void login(final String phoneNum, final String userPass) {  
  2.         Log.d(TAG, "login userPass = " + userPass);  
  3.         String url = Constant.USER_LOGIN_URL;  
  4.         FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();  
  5.         AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();  
  6.           
  7.         saveCookie(client);  
  8.           
  9.         RequestParams params = finalAsyncHttpClient.getCommonRequestParams(this);  
  10.         params.put("username", phoneNum);  
  11.         params.put("pwd", userPass);  
  12.         client.post(url, params, new AsyncHttpResponseHandler() {  
  13.   
  14.             @Override  
  15.             public void onFailure(int statusCode, Header[] headers,  
  16.                     byte[] errorResponse, Throwable e) {  
  17.                   
  18.             }  
  19.   
  20.             @Override  
  21.             public void onSuccess(int statusCode, Header[] headers,  
  22.                     byte[] response) {  
  23.                 Log.d(TAG, "onSuccess statusCode = " + statusCode);  
  24.                 String json = new String(response);  
  25.                 Utils.setCookies(getCookie());}});}  

 

 

在登陆时调用的方法

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. protected void saveCookie(AsyncHttpClient client) {  
  2.         PersistentCookieStore cookieStore = new PersistentCookieStore(this);  
  3.         client.setCookieStore(cookieStore);  
  4.     }  
  5.   
  6.     protected List<Cookie> getCookie(){  
  7.         PersistentCookieStore cookieStore = new PersistentCookieStore(this);  
  8.         List<Cookie> cookies = cookieStore.getCookies();  
  9.         return cookies;  
  10.     }  
  11.       
  12.     public void clearCookie(){  
  13.         PersistentCookieStore cookieStore = new PersistentCookieStore(this);  
  14.         cookieStore.clear();  
  15.     }  


在Activity中调用:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private void getTaskPicTags(final String url){  
  2.         Log.d(TAG, "getTaskPicTags url = " + url);  
  3.         FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();  
  4.         AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();  
  5.         RequestParams params = finalAsyncHttpClient.getCommonRequestParams(this);  
  6.         client.get(url, params, new AsyncHttpResponseHandler() {  
  7.               
  8.             @Override  
  9.             public void onSuccess(int statusCode, Header[] headers,  
  10.                     byte[] responseBody) {  
  11.                 String json = new String(responseBody);  
  12.                  Log.d(TAG, "onSuccess " + json);  
  13.                             }  
  14.   
  15.             @Override  
  16.             public void onFailure(int statusCode, Header[] headers,  
  17.                     byte[] responseBody, Throwable error) {  
  18.                 Log.e(TAG, "onFailure " , error);  
  19.                    
  20.                   
  21.             }  
  22.         });  
  23.       
  24.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值