2011
01.04

一、什么是Flash Cookies?

Cookies是一种保存在电脑上的文本文件,它可以用来记录访客的登录ID、使用偏好、习惯,以便更好地为访客提供个性化服务、方便访客的使用。但是在客户端Cookie里保存数据是不稳定的,因为用户可能随时会清除掉浏览器的Cookie,在这种情况下就需要新的技术来替代Cookies以实现继续追踪用户。Adobe公司的Local Shared Object(Flash Cookies)技术就能轻易的实现这种追踪。新浪、搜狐、腾讯、淘宝、优酷等都在使用这种技术。

FlashCookie是由FlashPlayer控制的客户端共享存储技术,它具备以下特点:1、类似HTTP Cookie,Flash Cookie利用 SharedObject类实现本地存储信息,SharedObject类用于在用户计算机上读取和存储有限的数据量,共享对象提供永久贮存在用户计算机上的对象之间的实时数据共享;2、本地共享对象是作为一些单独的文件来存储的,它们的文件扩展名为.SOL;3、本地共享对象并不是基于浏览器的,所以普通的用户不容易删除它们。如果要删掉它们的话,首先要知道这些文件所在的具体位置。这使得本地共享对象能够长时间的保留在本地系统上。

二、Flash Cookies和Cookies有什么区别?

1、存储大小不同 cookies仅允许存储4KB,而flash cookies则存储100KB—这只是默认的,还可以调整大小。

2、存储时长不同 一般来说,cookies是有消亡期的,它会在一段时间后自动消失;而flash cookies并不,如果你没有删除它,它就永远保留在你的电脑上。

3、存储位置不同 普通cookies的位置人们并不需要知道,因为他们可以通过许多软件进行删除,甚至浏览器本身都内置了这一功能。而flash cookies则是存储在C:\Documents and Settings\用户名\Application Data\Macromedia\Flash Player文件夹下。其中#sharedobjects文件夹用于存储flash cookies,macromedia.com存储flash cookies的全局设置。

三、如何使用Flash Cookies?

要实现Flash Cookie永远存储的功能,显然,首先要实现Flash Cookie与Http Cookie的互通,所以,在技术上使用JavaScript与ActionScript的来进行沟通显然是最好的选择,因为在这两种语言之间,除了语法上相近,从沟通上也有着完美的实现。下面我们来看看实现流程(如图所示):

ActionScript实现:

在明确了实现流程之后,那么接下来就是具体的实现了,首先是基础建设,在Flash端,我们使用的是ActionScript3来编程,下面实现了一个基本的Flash Cookies存储的类,在接下来的过程当中,我们将通过这个类来实现对Flash Cookies的操作。当然,这里只是把流程以及关键的技术讲清楚,涉及到具体的操作,则需要您自己来实现。

package laohan.flashcookie {  //注:由于我没有装Flex,所以只好使用Flash CS3来嵌入。  //如果使用Flash Developer,则MovieClip这个包可以不包含。  import flash.display.MovieClip;  import flash.net.SharedObject;  import flash.external.ExternalInterface;     public class myFlashCookie extends MovieClip {//如果使用Flex,可以不继承这个类。  private var cookieTimeOut:uint;  private var cookieName:String;  private var cookieSharedObj:SharedObject;  private var currentCookie:Object;  private var cookieValue:String;     //构造函数。  public function myFlashCookie(cName:String = "handaoliang", timeOut:uint=3600) {  cookieName = cName;  cookieTimeOut = timeOut;  cookieSharedObj = SharedObject.getLocal(cName, "/" );  if(isCookieExist(cName)){//如果FlashCookies存在。  currentCookie = getCookies(cName);  //调用JavaScript里的jsSetCookies方法来设置HTTPCookie  ExternalInterface.call("jsSetCookies",{fcookie:currentCookie});  //trace(currentCookie);  }  }  //到期删除Cookies  public function clearTimeOut():void {  var obj:* = cookieSharedObj.data.cookie;  if(obj == undefined){  return;  }  for(var key in obj){  if(obj[key] == undefined || obj[key].time == undefined || isTimeOut(obj[key].time)){  delete obj[key];  }  }  cookieSharedObj.data.cookie = obj;  cookieSharedObj.flush();  }  //添加Cookies( key-value )  public function saveCookies(key:String, value:*):void {  var today:Date = new Date();  key = "key_"+key;  value.time = today.getTime();  if(cookieSharedObj.data.cookie == undefined){  var obj:Object = {};  obj[key] = value;  cookieSharedObj.data.cookie = obj;  }else{  cookieSharedObj.data.cookie[key] = value;  }  cookieSharedObj.flush();  }  //删除当前Cookies  public function removeCookies(key:String):void {  if (isCookieExist(key)) {  delete cookieSharedObj.data.cookie["key_" + key];  cookieSharedObj.flush();  }  }  //通过Key来获取Cookies值。  public function getCookies(key:String):Object{  return isCookieExist(key)?cookieSharedObj.data.cookie["key_"+key]:null;  }  //检查Cookies是否存在。  public function isCookieExist(key:String):Boolean{  key = "key_" + key;  return cookieSharedObj.data.cookie != undefined && cookieSharedObj.data.cookie[key] != undefined;  }  //检查Cookies的到期时间  private function isTimeOut(time:uint):Boolean {  var today:Date = new Date();  return time + cookieTimeOut * 1000 < today.getTime();  }  //取得Cookies的到期时间;  public function getTimeOut():uint {  return cookieTimeOut;  }  //取得Cookies名称。  public function getName():String {  return cookieName;  }  //清除所有的Cookies值。  public function clearCookies():void {  cookieSharedObj.clear();  }  }  }

将所有的模块编译成SWF文件,我们将其命名为:hdl.swf,在上面的代码中,我们首先在构造函数里检查了Flash Cookie是否存在,如果存在,则会调用一个叫jsSetCookies的JavaScript方法来设置HTTP Cookie。那么,我们接下来要使用JavaScript来实现此SWF的调用以及互动。

JavaScript的实现:

1)首先要预定义一个供ActionScript3调用的方法,即上面说过的jsSetCookies方法。

//先定义一个全局变量  var flashCookiesValue = Null;  var jsSetCookies = function(flahCookieValue){  var o = arguments[0];  flashCookiesValue = o.fcookie;//在SWF执行时传递过来的值。  document.cookie="handaoliang="+flashCookiesValue+";path=/;expires=Fri, 04-Dec-2009 08:44:07 GMT;domain=handaoliang.com";  };

2)检查特定的HTTPCookies是否存在,如果不存在,则在页面上生成Object Dom节点,把hdl.swf加载进来。此时SWF会去检查Flash Cookies是否存在,如果存在,则去取得Flash Cookies,并且通过调用jsSetCookies来设置HTTP Cookies:

if(document.cookie.indexOf("handaoliang=") < 0){      //先去load hdl.swf,即在页面上生成Object对象:      var jsLoadFlash = function(){          var myFlashURL = "hdl.swf";          var myFlashObj = document.createElement("object");          myFlashObj.setAttribute("id","myFlash");          myFlashObj.setAttribute("classid","clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");          myFlashObj.setAttribute("width",0);          myFlashObj.setAttribute("height",0);          var flahParamObj = document.createElement("param");          flahParamObj.setAttribute("name","movie");          flahParamObj.setAttribute("value",myFlashURL);             var subMyFlashObj = document.createElement("object");          subMyFlashObj.setAttribute("type","application/x-shockwave-flash");          subMyFlashObj.setAttribute("data",myFlashURL);          subMyFlashObj.setAttribute("width",0);          subMyFlashObj.setAttribute("height",0);             myFlashObj.appendChild(flahParamObj);          myFlashObj.appendChild(subMyFlashObj);             var myDHTMLBody = document.body;          if(myDHTMLBody){              myDHTMLBody.appendChild(myFlashObj);          }      };      jsLoadFlash();  }

倘若Flash Cookies里也没有存储我们想要的数据呢?那么,此时就必须通过JS去请求特定的URL,然后使用JavaScript去调用AS3的方法来设置Flash Cookies吧。

暂无回复

添加回复