前言:
在我负责的一个项目中,为了实现一个特殊的需求,要求在客户端的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:
-
if(document.cookie.indexOf("handaoliang=")<0){
-
//先去load hdl.swf,即在页面上生成Object对象:
-
varjsLoadFlash =
function(){
-
varmyFlashURL =
"hdl.swf";
-
varmyFlashObj =
document.createElement("object");
-
myFlashObj.setAttribute("id","myFlash");
-
myFlashObj.setAttribute("classid","clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
-
myFlashObj.setAttribute("width",0);
-
myFlashObj.setAttribute("height",0);
-
varflahParamObj =
document.createElement("param");
-
flahParamObj.setAttribute("name","movie");
-
flahParamObj.setAttribute("value",myFlashURL);
-
varsubMyFlashObj =
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);
-
varmyDHTMLBody =
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--
分享到:
相关推荐
- **永久的远程共享对象**:在客户端代码中,使用`SharedObject.getRemote()`并设置`persistence`参数为`true`,或在服务器端使用`SharedObject.get()`创建。这些对象以.fso扩展名存储在服务器上的特定目录下。 **...
Cookies常用于用户身份验证,有大小限制且会随HTTP请求发送,sessionStorage在浏览器会话中存储数据,关闭浏览器即失效,而localStorage提供持久化存储,除非被清除,否则数据会永久保存。 iframe框架可以嵌入一个...
HTML5的Javascript API扩展...Web Storage提供了解决客户端数据存储需求的高效、安全且灵活的解决方案,使得应用能在用户关闭浏览器后仍能记住状态,缓存数据,以及保存用户偏好等,极大地丰富了Web应用的功能和性能。
由于注入的是动态页面,所以这种攻击方式只在点击链接时有效,不会在页面上永久留下痕迹,因此被称为非持久型XSS。 2. 存储型XSS(持久型XSS): 存储型XSS攻击的代码会永久存储在服务器的数据库或文件中。这类攻击...
而Web Storage(包括localStorage和sessionStorage)则提供了比Cookie更大的存储空间,用于临时或永久保存用户数据。 画布(Canvas)和SVG(Scalable Vector Graphics)是HTML5的两大图形处理工具。Canvas通过...
除在保密期内的保密论文和在技术保护期限内的论文外,允许论文被查阅和借阅,可以公布(包括以电子信息形式刊登)论文的全部内容或中、英文摘要等部分内容。论文的公布(包括以电子信息形式刊登)授权东南大学研究生...