Cookie机制与Android中AsyncHttpClient cookie的使用

第一次请求调用header信息
第一次调用的header的信息
第二次请求header信息
第一次调用的header的信息

第一次请求时,服务器会在Response Header中带过来一个Set-Cookie,内容为JSESSIONID=C3E668A891BA4E1C160C91A7EBEAA540.h2;再次请求时,浏览器会在Requst Header中的Cookie将JSESSIONID带上

Android中AsyncHttpClient的Cookie使用

  • 获取Cookie的方法
/**
     * 获取Cookie
     */
    public static Map<String,String> getCookieText(Context context) {
        PersistentCookieStore myCookieStore = new PersistentCookieStore(context);
        List<Cookie> cookies = myCookieStore.getCookies();
        //Log.d(TAG, "cookies.size() = " + cookies.size());
        CookieUtil.setCookies(cookies);
        for (Cookie cookie : cookies) {
            //Log.d(TAG, cookie.getName() + " = " + cookie.getValue());
        }
        Map<String,String> map = new HashMap<>();
        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))
            {
                map.put(cookieName,cookieValue);
            }
        }
        return map;
    }

在请求完成后调用

ZWAsyncHttpClient.post(url, params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int i, Header[] headers, byte[] bytes) {
                String res = "";
                try{
                    res = new String(bytes);
                    //获取cookie
                    Map<String,String> cookie = ZWAsyncHttpClient.getCookieText(context);
                    String c = FastjsonHelper.serialize(cookie);
                    //.....
                }catch (Exception e){
                    hideLoading();
                    showErrorTip(context,res);
                }
            }

            @Override
            public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
                hideLoading();
                showErrorTip(context,"服务器异常,请稍后再试!");
            }
        });
  • 自定义AsyncHttpClient工具类
import android.content.Context;
import android.text.TextUtils;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.PersistentCookieStore;
import com.loopj.android.http.RequestParams;

import org.apache.http.cookie.Cookie;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class ZWAsyncHttpClient
{
    private String TAG = "ZWAsyncHttpClient";
    private static AsyncHttpClient m_client;

    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler)
    {
        getInstance(App.getApp().getApplicationContext()).get(getAbsoluteUrl(url), params, responseHandler);
    }

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler)
    {
        getInstance(App.getApp().getApplicationContext()).post(getAbsoluteUrl(url), params, responseHandler);
    }

    public static AsyncHttpClient getInstance(Context paramContext)
    {
        if ( m_client == null )
        {
            m_client = new AsyncHttpClient();
            m_client.setConnectTimeout(5);//5s超时
            PersistentCookieStore ck = new PersistentCookieStore(paramContext);
            m_client.setCookieStore(ck);
            //m_client.setURLEncodingEnabled(false);
        }
        return m_client;
    }

    private static String getAbsoluteUrl(String relativeUrl)
    {
        String url = relativeUrl;
        return url;
    }

    /**
     * 获取Cookie
     */
    public static Map<String,String> getCookieText(Context context) {
        PersistentCookieStore myCookieStore = new PersistentCookieStore(context);
        List<Cookie> cookies = myCookieStore.getCookies();
        //Log.d(TAG, "cookies.size() = " + cookies.size());
        CookieUtil.setCookies(cookies);
        for (Cookie cookie : cookies) {
            //Log.d(TAG, cookie.getName() + " = " + cookie.getValue());
        }
        Map<String,String> map = new HashMap<>();
        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))
            {
                map.put(cookieName,cookieValue);
            }
        }
        return map;
    }
}

请求时添加cookie是这两行

PersistentCookieStore ck = new PersistentCookieStore(paramContext);
m_client.setCookieStore(ck);

请求时会自动添加获取到的cookie值

  • 移除Cookie,可在退出时调用
 private void removeCookie()
 {
     CookieSyncManager.createInstance(context);
     CookieManager cookieManager = CookieManager.getInstance();
     cookieManager.removeAllCookie();
     CookieSyncManager.getInstance().sync();
 }

设置cookie

/**
     * 请求时的PersistentCookieStore设置Cookie
     * 如在webview请求后cookie要设置到http中(保持同一会话)
     * @param context
     * @return
     */
    private static void syncPersistentCookie(Context context) {
        Map<String,String> map = getWebViewCookie();
        if(map == null || map.size()==0)
            return;
        PersistentCookieStore myCookieStore = new PersistentCookieStore(context);
        for (Map.Entry<String, String> entry : map.entrySet()) {
            Cookie cookie = new BasicClientCookie(entry.getKey(),entry.getValue());
            ((BasicClientCookie) cookie).setVersion(0);
            ((BasicClientCookie) cookie).setDomain("xxx.com");
            ((BasicClientCookie) cookie).setPath("/");

            Calendar calendar =Calendar. getInstance();
            calendar.add( Calendar. DATE, 1); //向后走一天,过期时间
            Date date= calendar.getTime();
            ((BasicClientCookie) cookie).setExpiryDate(date);
            myCookieStore.addCookie(cookie);
        }
    }
发布了76 篇原创文章 · 获赞 39 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_26075861/article/details/86537089