Cookies的作用我就不多说了,不知道的请移步百度,自行了解,给WebVIew注入cookies大致上分为4个步骤:
step1:给AsyncHttpClient设置CookieStore
final AsyncHttpClient client = new AsyncHttpClient();
myCookieStore = new PersistentCookieStore(LoginActivity.this);
client.setCookieStore(myCookieStore);
step2:使用client发送网络请求
step3:client成功发送网络请求之后,此时myCookieStore 中已有cookies信息。
step4:由于此时取得的cookieStore的类型是 PersistentCookieStore ,必须拿出cookies 内容:
public static String getCookieString(PersistentCookieStore myCookieStore) {
List<Cookie> cookies = myCookieStore.getCookies();
for (Cookie cookie : cookies) {
Log.e(this.getClass().getSimpleName(), 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();
}
然后再将上面这个方法中获得的cookies字符串设置给系统,让WebView访问该站点的时候能携带cookies访问:
public static void synCookies(Context context, String hostURL , String cookies) {//hostURL = http://192.168.124.38
CookieSyncManager createInstance = CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(hostURL, cookies);
cookieManager.setCookie(hostURL, "domain="+hostURL);
cookieManager.setCookie(hostURL, "path="+hostURL);
createInstance.sync();
}
总结:整个过程中并未涉及到WebView ,据我推测应该是CookieSyncManager、CookieManager 应该都是全局的东西(从它们对象实例的获取方式上就能猜出来),设置完这两个对象之后,WebView在载入一个新的URL时会自动去检测是否携带该cookies访问该URL。以上步骤中需要注意的有两点,第一,在WebView要携带cookies访问URL之前必须先调用synCookies;第二,cookies中必须加入domian和path字段,而且还必须和hostURL一致,不然会导致cookies无效。