首先付上操作本地cookie数据库的操作类(android版本不同,请求产生的cookie可能存于databases/webview.db表cookies或app_webview/Cookies表cookies或其它路径等),按CURD BSF操作(create,update,read,delete,bind,set,find)
package shared;
import java.util.List;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.Context;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
public class WebViewCookie {
public static void S(Context context,HttpGet httpget, String url) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
String str = cookieManager.getCookie(url);
httpget.setHeader("Cookie", str);
}
public static void S(Context context,String cookie, String url) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, cookie);
CookieSyncManager.getInstance().sync();
}
public static void C(Context context,DefaultHttpClient httpClient, String url) {
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
if (cookies != null) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
for (Cookie cookie : cookies) cookieManager.setCookie(url, cookie.getName() + "=" + cookie.getValue());
CookieSyncManager.getInstance().sync();
}
}
public static boolean F(Context context,String url,String key) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
String str = cookieManager.getCookie(url);
if(str!=null){
if(str.contains(";")){
for (String item : str.split(";"))
if(item.indexOf(key)==0)return true;
}else return str.indexOf(key)==0;
}return false;
}
public static String R(Context context,String url) {
CookieSyncManager.createInstance(context);
return CookieManager.getInstance().getCookie(url);
}
public static void D(Context context) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
}
}
简单应用如下:
package utility;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Handler;
import com.heiyouhui.m.Flag;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* Author: jamky
* Date: 2015/6/11
* Description: 主要应用于网络请求
*/
public class HttpUtils {
/**
* Http 远程请求
* @param context 非null时表示请求保持cookie同步,cookie的expires为17位utc时间格式
* @param url 可决定是否编码后再传过来, URLEncoder.encode("paramValue", "utf-8");
* @param requestType 请求返回数据的类型:Flag.STRING , Flag.BITMAP, Flag.DOC
* @param timeout 链接超时与读取超时,单位为秒
* @param handle 异步回调主体,常见代码: @Override handleMessage(Message msg); if (msg.what == 1); new Boolean(msg.obj.toString()).booleanValue(); new JSONObject(msg.obj.toString()); .setImageDrawable(new BitmapDrawable((Bitmap) msg.obj))
*/
public static void Get(final Context context,
final String url,
final int requestType,
final int[] timeout,
final Handler handle){
new Thread(){
@Override
public void run() {
try {
Object object = Get(context, url, requestType, timeout);
handle.obtainMessage(1, object).sendToTarget();
}catch (Exception e) {
handle.obtainMessage(0, null).sendToTarget();
}
}
}.start();
}
static Object Get(final Context context,
final String url,
final int requestType,
final int[] timeout) throws Exception {
DefaultHttpClient dhc = new DefaultHttpClient();
if(null!=timeout&&timeout.length>1){
dhc.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout[0]*1000);
dhc.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout[1]*1000);
}
HttpGet httpget = new HttpGet(url);
WebViewCookie.S(context, httpget, url);
HttpResponse response = dhc.execute(httpget);
Object object = null;
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
WebViewCookie.C(context, dhc, url);
InputStream input = response.getEntity().getContent();
switch (requestType) {
case Flag.BITMAP:
object = BitmapFactory.decodeStream(input);
break;
default:
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String s;
StringBuilder builder = new StringBuilder();
while ((s = reader.readLine()) != null)
builder.append(s);
reader.close();
object = requestType == Flag.JSON ? new JSONObject(builder.toString()) : builder.toString();
}
input.close();
}
return object;
}
}
本次cookie编程经验得出以下几点:
1.webview会主动发送本地同域cookie到服务器2.webview请求的地址若有cookie生成时,在页面加载完毕后(可在onPageFinished中捕获),自动写入到本地cookie数据库3.若想同步cookie(android提前获取页面产生的cookie),需在获取前加CookieSyncManager.createInstance(context);(同步对象产生即cookie主动同步)4.http请求不会主动发送cookie,想发送cookie需在HttpResponse实例化前通过HttpGet对象.setHeader("Cookie", "a=1;b=3;c=2");设置5.http请求的地址若有cookie生成时,在HttpResponse实例化后才可才可通过DefaultHttpClient对象.getCookieStore().getCookies();获得List<Cookie>;(不知怎的,地址是局域网的会自动写入到android本地数据库)6.若想将该域名获得的cookie另外保存,则可以在HttpResponse实例化后通过DefaultHttpClient对象.getCookieStore().getCookies();获得List<Cookie>
7.比较特殊,webview加载的若是本地地址,如:file:///android_asset/,则该加载的文件内部JS有产生cookie的代码,则产生的cookie是无效的,若
用代码去获取,得到的值始终是null, 或JS里有跨域请求远程地址的(jsonp),而远程地址产生了cookie, 则JS里获取cookie也是无效的,值也为null,且cookie也不会
写入到anroid的本地cookie数据库的,但此跨域导致的无效cookie是可以解决的,解决方法是在远程服务器给响应头加上P3P(the Platform for Privacy Preferences,协议设置,即平台隐私共享协议,详情参考W3C官方文档),则在本地html中用JS就可以获取到cookie的值了,且该本地html页面加载完毕后也会将cookie写入到anroid的本地cookie数据库,示例代码如下(c#.net代码):
ViewBag.rs = "no";
HttpCookie ck2 = Request.Cookies["cgj22"];
if (ck2 != null) { ViewBag.rs = "has"; }
HttpCookie ck1 = new HttpCookie("cgj23");
ck1.Values.Add("A", "aaa");
ck1.Values.Add("B", "bbb");
ck1.Expires = DateTime.Now.AddDays(30);
HttpCookie ck3 = new HttpCookie("cgj24","ccc");
Response.AddHeader("P3P", "CP=CAO PSA OUR");
Response.AppendCookie(ck1);
//android客户端获取到的cookie值是这样的 cgj23=A=aaa&B=bbb;cgj24=ccc 所以再切分cookie值的时候自己注意了
参考以下:
session保持通用法:http://blog.csdn.net/edward_qing_lee/article/details/15178451
发送cookie到远程http地址:http://blog.csdn.net/linghu_java/article/details/6402155
从http读取cookie ,,发送cookie到远程http地址:http://www.67tgb.com/?p=536
从http读取cookie ,,发送cookie到远程http地址,android写cookie(数据库方法):http://www.cnblogs.com/cosiray/archive/2012/05/09/2491485.html
android写cookie(cookieManager类操作方法):http://whao189.iteye.com/blog/1121865
cookieManager类对cookie的写及清除:http://www.kankanews.com/ICkengine/archives/103193.shtml
解决本地html不能写cookie问题:http://stackoverflow.com/questions/4543349/load-local-html-in-webview
持久化保存cookie:http://blog.csdn.net/jwzhangjie/article/details/29861111
保持登录:http://www.360doc.com/content/13/1120/11/7471983_330712023.shtml