cookie and session

首先付上操作本地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


获取指定路径下的数据库:http://stackoverflow.com/questions/24053489/not-able-to-create-database-in-phonegap-for-android/24056376#24056376




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值