android之cookie

来源:互联网 发布:淘宝第二次申请售后 编辑:程序博客网 时间:2024/06/05 14:56

1 . 什么是Cookie

Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

2. Cookie机制

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

3. 记录用户访问次数

Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookiecookie)向客户端设置Cookie。

Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。


项目中需要添加Cookie,所以引入Cookie工具类CookieUtils,代码如下:



import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import cn.ddhl.cust.log.DLog;


/**
 * @date 2016-5-27
 * @description Cookie工具类
 */
public class CookieUtils {

static final String TAG = CookieUtils.class.getSimpleName();

/**
* 得到连接host

* @param urlStr
*/
public static String getUrlHost(String urlStr) {
try {
URL url = new URL(urlStr);
String hostName = url.getHost();
return hostName;
} catch (MalformedURLException e) {
DLog.e(TAG, e.getMessage());
return "";
}
}

/**
* 同步webview cookies多个域名地址
*/
public static void syncCookiesMap(Context context, HashMap<String, String> cookieMap, boolean isRemoveSession) {
if (cookieMap == null) {
return;
}
CookieSyncManager syncManger = CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if (isRemoveSession) {
cookieManager.removeSessionCookie();
}
syncManger.sync();
for (Map.Entry<String, String> m : cookieMap.entrySet()) {
String key = m.getKey();
String value = m.getValue();
syncCookies(context, key, value, false);
}
//日志
for (Map.Entry<String, String> m : cookieMap.entrySet()) {
String key = m.getKey();

String cookie = cookieManager.getCookie(key);
DLog.d("syncCookiesMap", "url:"+key + " cookie:" + cookie);
}

}

/**
* 同步webview cookies
*/
public static void syncCookies(Context context, String url, String cookieStr, boolean isRemoveSession) {
if (cookieStr == null) {
return;
}
CookieSyncManager syncManger = CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if (isRemoveSession) {
cookieManager.removeSessionCookie();
}
syncManger.sync();

String hostName = getUrlHost(url);

String[] cookies = cookieStr.split(";");

for(int i=0;i<cookies.length;i++){
cookieManager.setCookie(hostName, cookies[i]);
CookieSyncManager.getInstance().sync();
}

String cookie = cookieManager.getCookie(url);
DLog.d("syncCookies", "url:"+url + " cookie:" + cookie);
}
}

注意:由于项目有多个环境,所以需要分别设置:


  /**
     * cookie版本控制
     */
    public final static String COOKIE_APPVERSION = "2.4.0"; //项目开发版本号作为标示
    

/**
* 设置版本cookie
*/
public static void syncVersionCookies() {

HashMap<String, String> urls = new HashMap<String, String>();
urls.put(UrlConstant.getHostUrl(), "appversion="+DAppManager.COOKIE_APPVERSION);
urls.put(UrlConstant.getNewWebUrl(), "appversion="+DAppManager.COOKIE_APPVERSION);
urls.put(UrlConstant.getWebUrl(), "appversion="+DAppManager.COOKIE_APPVERSION);
urls.put(UrlConstant.getDeprecateWebUrl(), "appversion="+DAppManager.COOKIE_APPVERSION);

CookieUtils.syncCookiesMap(DAppManager.getContext(), urls, true);

}    该方法需要在项目初始化的时候调用。



0 0
原创粉丝点击