Flash Cookie【使用Flash Cookie技术在客户端永久保存HTTP Cookie 】(一)

Flash Cookie【使用Flash Cookie技术在客户端永久保存HTTP Cookie 】(一)前言:  在我负责的一个项目中,为了实现一个特殊的需求,要求在客户端的Cookie中长久保存一份数据,但是我们知道在客户端Cookie里保存数据是不稳定的,因为用户可能随时会清除掉浏览器的Cookie,在这种情况下,一般的解决方案是重新向服务器端发送一个请求,以获得一个新的HTTPCookie数据,并将其保存--就一般的交互需求而言,这是没有问题的。但是,倘若我的需求是:要求恢复到原来的Co

大家好,又见面了,我是你们的朋友全栈君。

前言:
  在我负责的一个项目中,为了实现一个特殊的需求,要求在客户端的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的操作。当然,这里只是把流程以及关键的技术讲清楚,涉及到具体的操作,则需要您自己来实现。

/**
 * 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方法。

//先定义一个全局变量
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吧。关于这一步,就由大家自己去实现吧。呵呵。

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

  当然,我这是删除过的,呵呵。

  –EOF–

 

原文地址:http://www.handaoliang.com/article_tag/flash-cookie

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158977.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 微生物组-宏基因组分析第8期 (报名直播课免费参加线下2020.7)[通俗易懂]

    微生物组-宏基因组分析第8期 (报名直播课免费参加线下2020.7)[通俗易懂]“福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析、宏基因组、Python课程和转录组的线上直播课。报名参加线上直播课的老师可在1年内选择参加同…

  • centos安装wget(很简单)

    centos安装wget(很简单)centos安装wget(很简单)yum-yinstallwgetyum-yinstallsetupyum-yinstallperlSearchingforGCC…Thepath""isnotvalidpathtothegccbinary.Wouldyouliketochangeit?[yes]如果出现这个就表明gcc没有安装yum…

    2022年10月17日
  • ldd命令 ubuntu_ldd命令

    ldd命令 ubuntu_ldd命令1.在制作自己的发行版时经常需要判断某条命令需要哪些共享库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行;在Linux环境下通过ldd命令即可实现,在终端下执行:ldd/bin/ls//ldd命令通常使用”-v”或”–verbose”选项来显示所依赖的动态连接库的尽可能的详细信息。即可得到/bin/ls命令的相关共享库文件列表:libtermcap.so.2=>/lib/…

  • 关系数据库基础理论[通俗易懂]

    关系数据库基础理论[通俗易懂]mysql系列之一关系数据库基础理论正是数据库管理的需要催生了数据库管理系统DBMS,而关系型数据库管理系统为RDBMS常见的数据模型有三种:-层次模型-网状模型-关系模型一、关系数据库的产生在DBMS出现之前,人们用文件来管理数据,但存在很多缺陷:1.数据冗余和不一致性。数据冗余表示在每个shell脚本中基本上都是/bin/bash,但很多用户使用…

    2022年10月16日
  • 搜集对编程有帮助的论坛以及个人空间信息_猿编程怎么样

    搜集对编程有帮助的论坛以及个人空间信息_猿编程怎么样(持续更新中)论坛:编程论坛——中国最大的编程者社区:http://bbs.bc-cn.net/编程论坛-编程爱好者学习的净土,程序员交流的园地:http://www.programbbs.com/豆瓣小组:java小组http://www.douban.com/group/java/大富翁论坛:http://w

  • rpc协议详解

    rpc协议详解RPC是一种远程过程调用的协议,使用这种协议向另一台计算机上的程序请求服务,不需要了解底层网络技术的协议。HTTP是一种超文本传输协议。是WWW浏览器和WWW服务器之间的应用层通讯协议。TCP协议:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。https://mp.weixin.qq.com/s?src=11&timestamp=1611734678&ver=2853&signature=igsdPz20ZUht*1IskaU0LxnFKvD6tD.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号