使用Flash Cookie技术在客户端永久保存HTTP Cookie「建议收藏」

2022-09-06 10:49:57 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。前言:   在我负责的一个项目中,为了实现一个特殊的需求,要求在客户端的Cookie中长久保存一份数据,但是我们知道在客户端Cookie里保存数据是不稳 定的,因为用户可能随时会清除掉浏览器的Cookie,在这种情况下,一般的解决方案是重新向服务器端发送一个请求,以获得一个新的HTTP Cookie数据,并将其保存--就一般的交互需求而言,这是没有问题的。但是,倘若我的需求是:要求恢复到原来的Cookie里保存数据呢?呵呵,这种 情况,倘若服务器端没有做特殊的处理的话,显然是很难实现的。在尝试了许多方法之后,我们最后选择使用FlashCookie技术来做。

一、什么是Flash Cookie?   下面我首先来介绍一下FlashCookie。   FlashCookie是由FlashPlayer控制的客户端共享存储技术,它具备以下特点:1、类似 HTTPCookie,FlashCookie利用SharedObject类实现本地存储信息,SharedObject类用于在用户计算机上读取和存 储有限的数据量,共享对象提供永久贮存在用户计算机上的对象之间的实时数据共享;2、本地共享对象是作为一些单独的文件来存储的,它们的文件扩展名 为.SOL。默认时,它们的尺寸为不超过100kB,并且不会过期——这一点与传统的HTTP Cookie不同(4KB);3、本地共享对象并不是基于浏览器的,所以普通的用户不容易删除它们。如果要删掉它们的话,首先要知道这些文件所在的具体位 置。这使得本地共享对象能够长时间的保留在本地系统上。   从上面可以看出,FlashCookie具有可操作性、比普通HTTPCookies有着更大存储空间、更好的隐蔽性等优点。加上现在FlashPlayer已经成为互联网用户标配之一,不存在兼容性的问题,因此它非常适合用来保护客户端数据、收集用户行为等。   根据加利福尼亚大学伯克利分校(University of California, Berkeley)的一项调查表明,目前全球Top100的网站中,至少有54家在使用Flash Cookie技术在进行用户行为收集,有兴趣的同学可以看看这篇文章:《Top websites using Flash cookies to track user behavior》

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

/** * Package laohan.flashcookie * Author:handaoliang * Create Date:2009.11.03 * Last Mofied Date:2009.11.03 * CopyRights:Handaoliang.com All Rights Reserved. **/ 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方法。

1 2 3 4 5 6 7

//先定义一个全局变量 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:

  1. if(document.cookie.indexOf(“handaoliang=“)<0){
  2. //先去load hdl.swf,即在页面上生成Object对象:
  3. var jsLoadFlash = function(){
  4. var myFlashURL = “hdl.swf“;
  5. var myFlashObj = document.createElement(“object“);
  6. myFlashObj.setAttribute(“id“,“myFlash“);
  7. myFlashObj.setAttribute(“classid“,“clsid:D27CDB6E-AE6D-11cf-96B8-444553540000“);
  8. myFlashObj.setAttribute(“width“,0);
  9. myFlashObj.setAttribute(“height“,0);
  10. var flahParamObj = document.createElement(“param“);
  11. flahParamObj.setAttribute(“name“,“movie“);
  12. flahParamObj.setAttribute(“value“,myFlashURL);
  13. var subMyFlashObj = document.createElement(“object“);
  14. subMyFlashObj.setAttribute(“type“,“application/x-shockwave-flash“);
  15. subMyFlashObj.setAttribute(“data“,myFlashURL);
  16. subMyFlashObj.setAttribute(“width“,0);
  17. subMyFlashObj.setAttribute(“height“,0);
  18. myFlashObj.appendChild(flahParamObj);
  19. myFlashObj.appendChild(subMyFlashObj);
  20. var myDHTMLBody = document.body;
  21. if(myDHTMLBody){
  22. myDHTMLBody.appendChild(myFlashObj);
  23. }
  24. };
  25. jsLoadFlash();
  26. }

  倘若Flash Cookies里也没有存储我们想要的数据呢?那么,此时就必须通过JS去请求特定的URL,然后使用JavaScript去调用AS3的方法来设置Flash Cookies吧。关于这一步,就由大家自己去实现吧。呵呵。

五、结语:   那么到这里,基本上就实现了使用Flash Cookies来永久保存客户端数据的全过程。最后顺便说一下就是,其实这种方式也只能用来对付非计算机专业人士,因为Flash Cookie本身也是可以删除的,一般情况下,flash cookie保存在系统的如下位置:C:Documents and SettingsyourusernameApplication DataMacromediaFlash Player#SharedObjects,如下图所示,一般情况下,在这个文件夹下可以看到很多的网站目录,里面有他们的Flash程序留下的痕 迹:   当然,我这是删除过的,呵呵。

  –EOF–

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154509.html原文链接:https://javaforall.cn

0 人点赞