本文是由葡萄城控件技术开发团队发布,转载请注明出处:葡萄城控件
了解更多开发工具和技巧,请前往葡萄城控件官网
了解企业级报表和Web应用,请前往葡萄城企业软件网站
Cookiejavascript
它是标准的客户端浏览器状态保存方式,可能在浏览器诞生不久就有Cookie了,为何须要Cookie 这个东东?因为HTTP协议没有状态,因此须要一个标志/存储来记录客户浏览器当前的状态,保证客户浏览器和服务器通信时能够知道客户浏览器当前的状态。Cookie就是记录这个状态的容器,Cookie在每次请求的时候都被带回到服务器,从而保证了Server能够知道浏览器当前的状态,因为Cookie会被带回到Server,因此Cookie的内容不能存太多,最多不能超过4K,4K 限制的介绍 http://ec.europa.eu/ipg/standards/cookies/index_en.htm
其中一段内容为:html
A browser is only required to store up to 300 cookies overall and maintain only the last 20 from each domain. The maximum size of a cookie is 4K of disk space.html5
可是在一些场景下可能须要存储超过4K或者更多的数据,可是这些数据不用在每次请求的时候被带回到服务器,只要能在客户的浏览器上保存住,而且能够方便的被Javascript读写就能够了,这种需求尤其在中大型RIA的应用场景下更加的迫切,部分数据放在客户浏览器,节约带宽,提升浏览速度。HTML5标准已经替咱们想到了知足这种需求的方案:sessionStorage , webSqlDatabase, 微软的IE 有 userData 方案。java
userData
微软对USERDATA的介绍: http://msdn2.microsoft.com/en-us/library/ms531424(VS.85).aspx
其中一段内容为:ios
Security Alert:For security reasons, a UserData store is available only in the same directory and with the same protocol used to persist the store.
Security Alert:Using this behavior incorrectly can compromise the security of your application. Data in a UserData store is not encrypted and therefore not secure. Any application that has access to the drive where UserData is saved has access to the data. Therefore, it is recommended that you not persist sensitive data like credit card numbers. For more information, see Security Considerations: DHTML and Default Behaviors.
……
The userData behavior persists data across sessions, using one UserData store for each object. The UserData store is persisted in the cache using the save and load methods. Once the UserData store has been saved, it can be reloaded even if Microsoft Internet Explorer has been closed and reopened.
Setting the userData behavior class on the html, head, title, or style object causes an error when the save or load method is called.web
userData能够在同目录同协议下相互访问,长期存储在客户机器上。最大存储空间也增大了不少。userData须要绑定到一个Dom元素上使用。在userData的method中有removeAttribute方法。通过测试代码发现removeAttribute方法好像不是很管用,须要使用像cookie过时的方式,才能够完全的删除一个userData Attribute。
在 http://www.itwen.com/04web/11skill/skill20060918/60588.html 中介绍说userData存储在X:\Documents and Settings\当前用户\UserData\ 目录下。具体细节MS在userData说明文档中没有具体说明。数据库
sessionStorage
HTML5 标准对 sessionStorage的介绍: http://www.whatwg.org/specs/web-apps/current-work/
其中对 sessionStorage 的介绍:windows
This specification introduces two related mechanisms, similar to HTTP session cookies [RFC2965], for storing structured data on the client side.
The first is designed for scenarios where the user is carrying out a single transaction, but could be carrying out multiple transactions in different windows at the same time.
Cookies dont really handle this case well. For example, a user could be buying plane tickets in two different windows, using the same site. If the site used cookies to keep track of which ticket the user was buying, then as the user clicked from page to page in both windows, the ticket currently being purchased would "leak" from one window to the other, potentially causing the user to buy two tickets for the same flight without really noticing.
To address this, this specification introduces the sessionStorage DOM attribute. Sites can add data to the session storage, and it will be accessible to any page from that origin opened in that window.promise
Html5 sessionStorage Demo: http://html5demos.com/storage
下面是根据 http://www.blogjava.net/emu/archive/2006/10/04/73385.html 中提到的IE FF 兼容userData的测试代码:浏览器
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
|
function
isIE() {
return
!!document.all;
}
function
initUserData() {
if
(isIE()) document.documentElement.addBehavior(
"#default#userdata"
);
}
function
saveUserData(key, value) {
var
ex;
if
(isIE()) {
//IE
with
(document.documentElement)
try
{
load(key);
setAttribute(
"value"
, value);
save(key);
return
getAttribute(
"value"
);
}
catch
(ex) {
alert(ex.message)
}
}
else
if
(window.sessionStorage) {
//FF 2.0+
try
{
sessionStorage.setItem(key, value)
}
catch
(ex) {
alert(ex);
}
}
else
{
alert(
"Error occured in user data saving. your browser do not support user data."
);
}
}
function
loadUserData(key) {
var
ex;
if
(isIE()) {
//IE
with
(document.documentElement)
try
{
load(key);
return
getAttribute(
"value"
);
}
catch
(ex) {
alert(ex.message);
return
null
;
}
}
else
if
(window.sessionStorage) {
//FF 2.0+
try
{
return
sessionStorage.getItem(key)
}
catch
(ex) {
alert(ex)
}
}
else
{
alert(
"Error occured in user data loading. your browser do not support user data."
)
}
}
function
deleteUserData(key) {
var
ex;
if
(isIE()) {
//IE
with
(document.documentElement)
try
{
load(key);
expires =
new
Date(315532799000).toUTCString();
save(key);
}
catch
(ex) {
alert(ex.message);
}
}
else
if
(window.sessionStorage) {
//FF 2.0+
try
{
sessionStorage.removeItem(key)
}
catch
(ex) {
alert(ex)
}
}
else
{
alert(
"Error occured in user data deleting. your browser do not support user data."
)
}
}
|
userData和sessionStorage共同的特色就是:这两个对象均可以存储比cookie大的多的多内容。而且不会随每次请求带回到服务器端。可是根据Html5标准和测试发现userData和sessionStorage有不少地方是不一样的。
下面是一个测试页面:
其中的 SetInsurance link 会操做javascript 在IE下用userData写数据, 在FF下用sessionStore写数据。在IE下的状况是:关闭IE或者重启机器写入的值都不会丢失。在FF下的状况颇有意思:在本页面写入的值在本页面能够访问,在由本页面所打开的其它页面能够访问。可是就算本页面开着,在导航栏里输入地址,打开本页面,存入的值就不能访问了。在本页面存入的值,在它的父页面(打开这个页面的页面)是访问不到的。又看了看Html5标准。sessionStorage 的全名是:Client-side session and persistent storage of name/value pairs 意思估计是存储在Client的内容是有session 会话的,存储的值由session会话所维系,一旦session会话中断或者丢失,存入的值也就随之消失了。因此当页面没有session(父页面,由地址栏打开的页面),是取不到值的。当FF关闭或者重启机器必然也就取不到值了。
webSqlDatabase
webSqlDatabase在HTML5 标准中是很是Cool的一个东东, 用Javascript写SQL查询,数据库就在浏览器里,这在之前几乎不敢想象。不过今天Safari, Chrome, Opera 都已经支持了,两个webSqlDatabase 的 Demo 页面: http://html5demos.com/database http://html5demos.com/database-rollback
W3C 对WEBSQLDATABASE 的介绍页面: http://dev.w3.org/html5/webdatabase/
WiKi上一个简明的说明: http://en.wikipedia.org/wiki/Web_SQL_Database
From W3C: "...an API for storing data in databases that can be queried using a variant of SQL"
Web SQL Database is supported by Google Chrome[1], Opera and Safari but will not be implemented by Mozilla(Firefox)[2] who instead propone Indexed Database API access.
不知道 HTML 5 的 SQLDB 会被浏览器支持的怎么样, 不过sessionStorage看上去已经能够基本知足需求了。