`

使用Flash Cookie技术在客户端永久保存HTTP Cookie

 
阅读更多

使用Flash Cookie技术在客户端永久保存HTTP Cookie

前言:
  在我负责的一个项目中,为了实现一个特殊的需求,要求在客户端的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的来进行沟通显然是最好的选择,因为在这两种语言之间,除了语法上相近,从沟通上也有着完美的实现。下面我们来看看实现流程(如图所示):
  使用FlashCookies来永远保存HTTPCookies流程图

  三、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. varjsLoadFlash = function(){
  4. varmyFlashURL = "hdl.swf";
  5. varmyFlashObj = 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. varflahParamObj = document.createElement("param");
  11. flahParamObj.setAttribute("name","movie");
  12. flahParamObj.setAttribute("value",myFlashURL);
  13. varsubMyFlashObj = 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. varmyDHTMLBody = 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 Settings\yourusername\Application Data\Macromedia\Flash Player\#SharedObjects\,如下图所示,一般情况下,在这个文件夹下可以看到很多的网站目录,里面有他们的Flash程序留下的痕迹:
Flash Cookies的保存位置
  当然,我这是删除过的,呵呵。

  --EOF--


分享到:
评论

相关推荐

    FlashCookie 不被浏览器清除的Cookie

    FlashCookie的工作原理是,当用户访问使用Flash技术的网站时,该网站可以请求在用户的本地存储设备上创建或更新一个Local Shared Object。这些对象存储在与Flash Player关联的特定目录下,而不是在浏览器的Cookie...

    CookiesjsJavaScript客户端的Cookie操作库

    "CookiejsJavaScript客户端的Cookie操作库" 指的是一种JavaScript库,专门用于在客户端(即用户浏览器)进行Cookie的操作。Cookiejs是这个库的名称,它提供了一组简单易用的API,帮助开发者方便地管理用户的Cookie。...

    在浏览器中使用flash 存储客户端数据

    标题中的“在浏览器中使用Flash存储客户端数据”指的是在Web应用程序中利用Adobe Flash Player插件提供的本地存储功能来保存用户数据。Flash Player允许网站在用户的计算机上存储一定量的数据,以便在用户下次访问时...

    Cookie将用户名和密码加密后存在客户端的Cookie当中

    实现这一功能的一种常见方法是通过在用户的浏览器中设置Cookie来保存登录状态。 #### 二、技术原理 Cookie是一种小型的数据文件,通常由服务器生成并发送到用户浏览器上。浏览器会将Cookie保存起来,并在后续请求...

    cookie接口 实现本地或客户端的cookie的创建和读取

    在客户端发送请求时,服务器可以通过HttpServletRequest对象读取Cookie。`getCookies()`方法返回一个Cookie数组,你可以遍历这个数组来获取每个Cookie的信息: ```java HttpServletRequest request; // ... ...

    利用Cookie实现十天免登录

    该资源主要利用Cookie是由服务器端生成并储存在浏览器客户端上的...我们还可以使用特殊的方法,将Cookie保存在客户端的硬盘上,永久性保存,这样关闭浏览器Cookie还是存在的,不会消失。所以可以用来实现十天免登录功能

    在C#中可以使用CookieContainer 对象来保存登录后的Cookie信息

    ### 在C#中使用CookieContainer对象保存登录后的Cookie信息 #### 概述 在Web开发过程中,为了保持用户的会话状态或存储用户的一些特定信息,通常会使用到Cookie技术。Cookie是一种小型的数据文件,用于存储客户端...

    引用外部类实现Flash Cookie的读写

    在`Cookie.fla`这个Flash文件中,我们可能会看到以下代码片段来使用`Cookie`类: ```actionscript import Cookie; var myCookieData:Object = {username: "JohnDoe", visits: 5}; Cookie.writeCookie("userData", ...

    使用flash在客户端存储数据

    标题“使用Flash在客户端存储数据”涉及到的是一个利用Adobe Flash技术在用户计算机本地存储数据的方法。Flash曾经是互联网上广泛使用的交互式内容平台,其中包括一项功能,允许网站在用户的浏览器中存储信息,以便...

    Cookie技术在PHP中的应用.pdf

    它可以让服务器在客户端保存信息,以便在后续的请求中使用。在 PHP 中,Cookie 技术可以用来实现在 Web 应用程序中的身份验证、购物车、session 管理等功能。 Cookie 的基本机制分析 HTTP 协议本身是无状态的,每...

    删除flashcookie和cookie(已经修改过了,alpha1.0.1版本)

    这是我看了2013的3.15晚会的...软件运行后,可以在report文件夹中,查看被删除的cookie和flashcookie的记录。也可以在conf文件夹中,通过conf配置conf.txt,设置需要保留的可以信任的网站的关键字。比如:amazon等。

    JSP中cookie的使用方法(用户登入,客户端读取及发送)[收集].pdf

    在 JSP 中,Cookie 是一种常用的技术,用于在客户端存储数据,以便在后续的访问中使用。下面是 JSP 中 Cookie 的使用方法,包括向客户端发送 Cookie、从客户端读取 Cookie 和使用 Cookie 记录访问数。 向客户端发送...

    Flash cookie操作

    与传统的HTTP Cookie不同,Flash Cookie不受浏览器的同源策略限制,因此可以存储更多的数据(最大100KB),并且在用户清除浏览器cookie时可能不会被删除。这个特性使得Flash Cookie成为一种强大的用户跟踪工具,但也...

    javaweb中Cookie对用户密码保存的例子

    在JavaWeb开发中,Cookie是一种常见的技术,用于在客户端存储少量信息,比如用户的登录状态、购物车内容等。本文将详细解析"javaweb中Cookie对用户密码保存的例子",并探讨如何使用Cookie实现购物车功能。 首先,...

    Cookie实例保存账号和密码

    在Web开发中,Cookie是一种非常重要的技术,用于在客户端存储少量的数据,比如用户登录状态、偏好设置等。本文将深入探讨“Cookie实例保存账号和密码”的概念,通过两个示例页面`login.jsp`和`bean.jsp`来阐述如何...

    禁用Cookie和Flash Cookie

    2013年的315晚会结束后想必大家都会关心Cookie和Flash Cookie这两个到底如何关闭,避免大家的信息暴露

    FlashCookie清理器

    然而,除了传统的HTTP Cookie,还存在一种名为Flash Cookie(也称为Local Shared Objects,LSO)的技术,它由Adobe Flash Player创建,功能与普通Cookie类似,但存储的位置和方式有所不同,这使得它们更难以被常规的...

    应用Java Script的Cookie做客户端计数器.pdf

    应用JavaScript的Cookie做...使用JavaScript的Cookie技术可以轻松地设计一个客户端计数器,记录每位访问者的来访次数,并显示每个用户的来访记录。这可以帮助网站管理员更好地了解用户的行为习惯和网站的访问情况。

    WEB客户端技术 WEB客户端技术

    在信息技术领域,Web客户端技术是构建互联网应用的核心部分,它涉及到用户通过浏览器或者其他Web接口与服务器进行交互的方式。本篇将深入探讨Web客户端技术的关键概念、技术栈以及应用实例。 首先,我们要理解Web...

Global site tag (gtag.js) - Google Analytics