第一次请求时,服务器会在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);
}
}