关于Qt

Qt是一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立 艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且 允许真正地组件编程。

自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用 程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,KDE是所有主要的Linux发行版的一个标准组件。

Qt支持下述平台:

  • MS/Windows – 95、98、NT 4.0、ME、和2000
  • Unix/X11 – Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它很多X11平台
  • Macintosh – Mac OS X
  • Embedded – 有帧缓冲(framebuffer)支持的Linux平台。

Qt是Trolltech公司的一个产品。

Qt被按不同的版本发行:

Qt企业Qt专业 提供给商业软件开发。它们提供传统商业软件发行版并且提供免费升级和技术支持服务。 如果要获得最新报价,请浏览Trolltech公司网站的价格和可行性页面,或者与sales@trolltech.com联系。 企业版比专业版多一些扩展模块
Qt自由是Qt仅仅为了开发自由和开放源码软件 提供的Unix/X11版本。在Q公共许可证GNU通用公共许可证 下,它是免费的。最新的版本可以在这里下载。
Qt/嵌入式自由是Qt为了开发自由软件提供的嵌入式版本。 在GNU通用公共许可证下,它是免费的。

Read: 811

[转]session和cookie的最深刻理解

对SESSION的争论好象一直没有停止过,不过幺麽能理解SESSION的人应该占90以上。
但还是讲讲,别嫌老~

有一些人赞成用SESSION,有一些人不赞成。但这个问题到底要怎么说。不妨听听我的看法

如果有错误请不要朝丢东西,金条和硬币除外。

有些人应该知道我是做江湖程序的,而江湖程序做看中的就是效率,但这里不谈设计,而

从一些比较实际的角度看SESSION。

首先要先说SESSION是干什么的,SESSION是可以存储针对与某一个用户的IE以及通过其当

前窗口打开的任何窗口具有针对性的用户信息存储机制。为什么要这样说。看下边

先研究SESSION是如何启动的,当打开IE以后浏览网站后会发出一个指令请求SESSIONID以

及对各个类型数据的下载许可,如图片,声音以及FLASH。
数据实际传输内容:IE到服务器
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language0: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: www.jh521.com
Connection: Keep-Alive
服务器会返回一个没有被使用的SESSIONID让IE使用,当时IE就对返回SESSIONID做存储

并同时返回相关页面的下载数据,如下:服务器到IE
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Sun, 30 Nov 2003 16:41:51 GMT
Content-Length: 21174..Content-Type: text/html
Set-Cookie: ASPSESSIONIDCACBBBRT=IBOMFONAOJFEEBHBPIENJFFC; path=/
Cache-control: private
然后就是页面HTML代码

此时这个IE程序(不是客户机)的SESSIONID就为IBOMFONAOJFEEBHBPIENJFFC

而当IE在访问任何这个站点的ASP程序的时候,就会把IBOMFONAOJFEEBHBPIENJFFC发送

给服务器,服务器就会知道IBOMFONAOJFEEBHBPIENJFFC是表示你
而在服务器上设置SESSION("name")="name"
完全可以看成是
SESSION("IBOMFONAOJFEEBHBPIENJFFC")("name")="name"
或者
SESSION(SESSIONID)("name")="name"
这样,SESSION就区分开用户了。
而当服务器反馈这个ID的时候会看这个ID有没有被使用。如果有在换一个
反正不会让你重复,如果想模拟某人的SESSION的ID来进行欺骗是可以的。不过要获取到

对方IE传输信号,并且在保证当时这个SESSIONID没有被取消的情况下才可能实施。

不过要是我有那时间直接通过POST信号找他NAME和PASS了。我可不费这个劲

想必一些人明白了了SESSIONID到底是如何工作的

那么就在看看COOKIE,有人说SESSIONID就是COOKIE,按照技术上来讲他们不属于同类

但是属于一种工作模式,用户和服务器传输私有数据

当我设置COOKIE的时候,服务器会反馈给IE一个指令。IE通过这个网络指令生成COOKIE并

存放,在特定的时候会取得这个这个信息如在访问这个站点并且COOKID有效的时候。

那么为什么要用COOKIE而不用SESSION呢
看下区别

有效时间以及存储方式 传输内容
COOKIE 可设置并在本地保留 明码信息

SESSION 在IE不关闭并服务器不超时 只有SESSIONID

当如果想让用户下次登入网站不需要输入用户名或者密码的时候就只能用COOKIE,

因为他可以保留相当长的时间(在COOKIE记录被删除或者失效日期之前)

而SESSION就不可以,他不会保留太长时间,而且IE在关闭后就自动清除了SESSIONID记录

在下次登入的时候会请求新的SESSIONID

而服务器想通过用户个人变量校验用户的状态的时候,就不能用COOKIE

如果用设置用户权限是USER。而IE访问的时候就把USER的明码传输到服务器。

那么如果我通过一定手段,比如直接修改COOKIE记录,把USER修改成ADMIN呢~~

就麻烦了。

但存储用户名和密码或者网站的配色方案这样的信息,用COOKIE是最好的

好,有点累了,在说说这个东西
Request.ServerVariables("HTTP_REFERER")

我想有一些人通过这个Request.ServerVariables("HTTP_REFERER")
来进行一些关键性限制,特别是对付远程提交以及非法侵入。
那么我就要提醒下服务器取得的HTTP_REFERER信息完全是IE传输给服务器的,可以模拟
而且难度不大,用不到半个小时就可以用VB做出一个针对HTTP_REFERER入侵程序。
(可惜我原先那他没干正经事情,做WEB游戏挂机程序来的)

顺便把我找到的一个关于SESSION的资料也弄过来吧 COOKIE的我前面发过了

session

一个人在网站上一次活动的过程。

当一个访问者来到你的网站的时候一个Session就开始了,当他离开的时候Session就结束了。本质是来说,cookie是和浏览器有关系,而 Session变量就可以存一些资源变量在服务器上面。PHP4用文件存储Session变量,但理论上可以用数据库或共享内存来做这件事。

所有的页面都用PHP4的Session必须用Session_start()功能函数来告诉PHP4引擎来取有关的Session到内存中

。函数Session_start()可以在cookie域里或请求的参数中取得Session_id为了响应http请求。如果不能找到

SessionID就新建一个Session。

什么是Session变量?

Session变量是个有规律的全局变量,当一个Session变量被注册,用PHP4可以在所有的页面上得到Session

的值。用Session_register("variable_name")可以注册一个Session变量。在所有并发的的用Session就使用

Session_start()函数,变量的值将作为一个Session变量注册为Session。

我们能作什么?

通常有很多的方法来管理Session和Session变量,我将给你个例子。说你将建一个商业站点,象我这样的,

你可能想保持已经被承认的用户当前的名字,或有多少的新消息用户已经得到。为了不在从数据库里读取,你

有两个方法可以做:

1.1.你可以用三个cookie

。authenticated_user – 当前的用户名称

。num_messages – 他得到的信息的数量

。expire_time – 何时重新读取信息数量

2.2.用sessions和新建三个session变量

第一个方法安全性不好,一些人可以得到cookie进入他人的领域。

用sessions用户仅得到一个cookie,安全的多。

缺点

session给了你自由,过度的用session会影响脚本语言的使用。虽然PHP4的session有些限制,如你不能存对象在session里。

long getCreationTime()                         取得session产生的时间,单位是毫秒
       String getId()                                  取得session 的ID
       long getLastAccessedTime()                      取得用户最后通过这个session送出请求的时间
       long getMaxInactiveInterval()                    取得最大session不活动的时间,若超过这时间,session 将会失效
       void invalidate()                                取消session 对象,并将对象存放的内容完全抛弃
       boolean isNew()                                  判断session 是否为"新"的
       void setMaxInactiveInterval(int interval)        设定最大session不活动的时间,若超过这时间,session 将会失效

Read: 856

兹罗列194种创意线索

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、把它遮蔽起来
97、变换气味
98、使它不对称
99、把它除臭
100、使它不对称
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、使用新广告媒体
90、把它由里外翻转
91、使它更强烈
92、把它向旁边转
93、使它更冷
94、摇动它
95、增加香味
96、把它遮蔽起来
97、变换气味
98、使它对称
99、把它除臭
100、使它不对称
101、将它向儿童诉求
102、反它隔开
103、将它向男士诉求
104、使它与其他相敌对
105、将它向妇女诉求
106、使它锐利
107、价钱更低
108、变更它的外形
109、抬高价格
110、要它绕一周
111、变更成份
112、把它框起来
113、增加新成份
114、把它卷成一圈
115、拧搓它
116、把它填满
117、使它透明
118、把它弄成空的
119、使它不透明
120、把它打开
121、用不同背景
122、把拼错
123、用不同环境
124、给它起我上绰号
125、使它富有魅力
126、把它封印起来
127、使用视觉效果
128、把它移转过来
129、使用另外的物料
130、把它捆包起来
131、增加人的趣味
132、把它集中起来
133、变更密度
134、把它推开
135、置于不同的货柜
136、使它成为交替的
137、变换包装
138、使它凝固起来
139、使密度增加
140、使它溶化
141、小型化
142、使成凝胶状
143、增加至最大限
144、使它软化
145、把它除掉
146、使它硬化
147、使它轻便
148、使蒸发变为汽化
149、使它可以折叠
150、加上抑扬顿挫
151、趋向偏激
152、使它更狭窄
153、如夏天炎热
154、使它更宽广
155、如冬天寒冷
156、使它更滑稽
157、使拟人化
158、使它成为被讽刺的
159、使它更暗
160、用简短的文案
161、使它发光
162、用冗长的文案
163、使它灼
164、发现第二种用途
165、使它更有营养
166、使它合成在一起
167、把它倒进瓶中
168、把它当作用具来卖
169、把它倒进罐中
170、使它清净
171、把它放进盒中
172、把它倒进壶中
173、把它倒进缸中
174、把它弄直
175、把它褶曲
176、把它缠起来
177、提升声誉
178、免费提供
179、以成本价出售
180、提供特价
181、增加慰藉的诉求
182、提供维护服务
183、运用不同的织法
184、使它变成香郁宜人
185、使它变成酸的
186、使它濡湿
187、使它脱水
188、使它干燥
189、把它冻起来
190、把它抛出去
191、使它无刺激性的
192、使它单纯化
193、使它具有刺激性的
194、把以上各项任意组合

Read: 985

COOKIE详解

Cookies,有些人喜欢它们,有些人憎恨它们。但是,很少有人真正知道如何使用它们。现在你可以成为少数人中的成员-可以自傲的Cookie 大师。–>

如果你象作者一样记性不好,那么你可能根本记不住人们的名字。我遇到人时,多半只是点点头,问句“吃了嘛!”,而且期望问候到此为止。如果还需要表示些什 么,那么我就得求助于一些狡猾的技巧,好让我能想对方是谁。比如胡扯起一些和对方有关的人,不管他们之间关系多远,只要能避免不记得对方名字的尴尬就好: “你隔壁邻居的侄子的可爱小狗迈菲斯特怎么样?”通过这个方法,我希望能让对方感到,我确实很重视他(她),甚至还记得这些琐事,虽然实际上连名字都忘记 了。但是,不是我不重视,而是我的记忆力实在是糟糕,而且要记住的名字又实在太多。如果我能给每个人设置cookies,那么我就不会再犯这种记忆力问题 了。

在这篇文章里,我们要学习:

1. 什么是 Cookies?
2. Cookie 的构成
3. 操纵 Cookies
4. Cookie 怪兽

什么是Cookies?

你会问,什么是cookies呢? cookie 是浏览器保存在用户计算机上的少量数据。它与特定的WEB页或WEB站点关联起来,自动地在WEB浏览器和WEB服务器之间传递。

比如,如果你运行的是Windows操作系统,使用Internet Explorer上网,那么你会发现在你的“Windows”目录下面有一个子目录,叫做“Temporary Internet Files”。如果你有空看看这个目录,就会发现里面有一些文件,文件名称看起来就象电子邮件地址。比如在我机器上的这个目录里,就有 “jim@support.microsoft.com”这样的文件。这是一个cookie 文件,这个文件从哪来呢?猜一猜,它来自微软的支持站点。顺便说一句,这不是我的电子邮件地址,特此澄清。

对于管理细小的、不重要的、不想保存在中央数据库里的细节信息,Cookies 是个很不错的方案。(这不是说大家的名字不重要。)比如,目前网站上不断增长的自定义服务,可以为每个用户定制他们要看的内容。如果你设计的就是这样一个 站点,那么你怎么来管理这样的信息:一个用户喜欢绿色的菜单条,而另一个喜欢红色的。确实是个累人的问题。不过,这样的信息,可以很安全地记录到 cookie,并保存在用户的计算机上,而你自己的数据库空间可以留给更长久更有意义的数据。

FYI: Cookies 对于安全用途,通常很有用。我不想在此就这一问题过于深入,只是提供一个示例,可以看到如何使用在一段时间之后过期的cookies来保证站点安全:

1. 使用用户名和口令,通过 SSL 登录。
2. 在服务器的数据库里检查用户名和口令。如果登录成功,建立一个当前时间标签的消息摘要 (比如 MD5) ,并把它保存在cookie和服务器数据库里。把用户的登录时间保存在服务器数据库里面的用户记录里。
3. 在进行每个安全事务时(用户处于登录状态的任何事务),把cookie的消息摘要和保存在服务器数据库里的摘要进行比较,如果比较失败,就把用户引导到登录界面。
4. 如果第3步检查通过,那么检查当前时间和登录时间之音经过的时间是否超过允许的时间长度。如果用户已经超时,那么就把用户引到登录界面。
5. 如果第3步和第4步都通过了,那么把登录时间重新设置成当前时间,允许事务发生。那些需要你登录的安全站点,可能多数使用的都是和这里介绍的类似的方法。
Cookie的构成

Cookies最初设计时,是为了CGI编程。但是,我们也可以使用Javascript脚本来操纵cookies。在本文里,我们将演示如何使用 Javascript脚本来操纵cookies。(如果有需求,我可能会在以后的文章里介绍如何使用Perl进行cookie管理。但是如果实在等不得, 那么我现在就教你一手:仔细看看CGI.pm。在这个CGI包里有一个cookie()函数,可以用它建立cookie。但是,还是让我们先来介绍 cookies的本质。

在Javascript脚本里,一个cookie 实际就是一个字符串属性。当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称和值。每个cookie除了 name名称和value值这两个属性以外,还有四个属性。这些属性是: expires过期时间、 path路径、 domain域、以及 secure安全。

Expires – 过期时间。指定cookie的生命期。具体是值是过期日期。如果想让cookie的存在期限超过当前浏览器会话时间,就必须使用这个属性。当过了到期日期时,浏览器就可以删除cookie文件,没有任何影响。

Path – 路径。指定与cookie关联的WEB页。值可以是一个目录,或者是一个路径。如果http: //www.zdnet.com/devhead/index.html 建立了一个cookie,那么在http://www.zdnet.com/devhead/目录里的所有页面,以及该目录下面任何子目录里的页面都可以 访问这个cookie。这就是说,在http://www.zdnet.com/devhead/stories/articles 里的任何页面都可以访问http://www.zdnet.com/devhead/index.html建立的cookie。但是,如果http: //www.zdnet.com/zdnn/ 需要访问http://www.zdnet.com/devhead/index.html设置的cookes,该怎么办?这时,我们要把cookies 的path属性设置成“/”。在指定路径的时候,凡是来自同一服务器,URL里有相同路径的所有WEB页面都可以共享cookies。现在看另一个例子: 如果想让 http://www.zdnet.com/devhead/filters/ 和http://www.zdnet.com/devhead/stories/共享cookies,就要把path设成“/devhead”。

Domain – 域。指定关联的WEB服务器或域。值是域名,比如zdnet.com。这是对path路径属性的一个延伸。如果我们想让 catalog.mycompany.com 能够访问shoppingcart.mycompany.com设置的cookies,该怎么办? 我们可以把domain属性设置成“mycompany.com”,并把path属性设置成“/”。FYI:不能把cookies域属性设置成与设置它的 服务器的所在域不同的值。

Secure – 安全。指定cookie的值通过网络如何在用户和WEB服务器之间传递。这个属性的值或者是“secure”,或者为空。缺省情况下,该属性为空,也就是 使用不安全的HTTP连接传递数据。如果一个 cookie 标记为secure,那么,它与WEB服务器之间就通过HTTPS或者其它安全协议传递数据。不过,设置了secure属性不代表其他人不能看到你机器本 地保存的cookie。换句话说,把cookie设置为secure,只保证cookie与WEB服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。如果想让本地cookie也加密,得自己加密数据。

操纵Cookies

请记住,cookie就是文档的一个字符串属性。要保存cookie,只要建立一个字符串,格式是name=<value>(名称=值),然 后把文档的 document.cookie 设置成与它相等即可。比如,假设想保存表单接收到的用户名,那么代码看起来就象这样:

document.cookie = "username" + escape(form.username.value);

在这里,使用 escape() 函数非常重要,因为cookie值里可能包含分号、逗号或者空格。这就是说,在读取cookie值时,必须使用对应的unescape()函数给值解码。

我们当然还得介绍cookie的四个属性。这些属性用下面的格式加到字符串值后面:

name=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; secure]

名称=<值>[; expires=<日期>][; domain=<域>][; path=<路径>][; 安全]

<value>, <date>, <domain> 和 <path> 应当用对应的值替换。<date> 应当使用GMT格式,可以使用Javascript脚本语言的日期类Date的.toGMTString() 方法得到这一GMT格式的日期值。方括号代表这项是可选的。比如在 [; secure]两边的方括号代表要想把cookie设置成安全的,就需要把"; secure" 加到cookie字符串值的后面。如果"; secure" 没有加到cookie字符串后面,那么这个cookie就是不安全的。不要把尖括号<> 和方括号[] 加到cookie里(除非它们是某些值的内容)。设置属性时,不限属性,可以用任何顺序设置。

下面是一个例子,在这个例子里,cookie "username" 被设置成在15分钟之后过期,可以被服务器上的所有目录访问,可以被"mydomain.com"域里的所有服务器访问,安全状态为安全。

// Date() 的构造器设置以毫秒为单位
// .getTime() 方法返回时间,单位为毫秒
// 所以要设置15分钟到期,要用60000毫秒乘15分钟
var expiration = new Date((new Date()).getTime() + 15 * 60000);
document.cookie = "username=" + escape(form.username.value)+ "; expires ="
+ expiration.toGMTString() + "; path=" + "/" + "; _
domain=" + "mydomain.com" + "; secure";

读取cookies值有点象个小把戏,因为你一次就得到了属于当前文档的所有cookies。

// 下面这个语句读取了属于当前文档的所有cookies
var allcookies = document.cookie;

现在,我们得解析allcookies变量里的不同cookies,找到感兴趣的指定cookie。这个工作很简单,因为我们可以利用Javascript语言提供的扩展字符串支持。

如果我们对前面分配的cookie "username" 感兴趣,可以用下面的脚本来读取它的值。

// 我们定义一个函数,用来读取特定的cookie值。
function getCookie(cookie_name)
{
var allcookies = document.cookie;
var cookie_pos = allcookies.indexOf(cookie_name);

// 如果找到了索引,就代表cookie存在,
// 反之,就说明不存在。
if (cookie_pos != -1)
{
// 把cookie_pos放在值的开始,只要给值加1即可。
cookie_pos += cookie_name.length + 1;
var cookie_end = allcookies.indexOf(";", cookie_pos);

if (cookie_end == -1)
{
cookie_end = allcookies.length;
}

var value = unescape(allcookies.substring(cookie_pos, cookie_end));
}

return value;
}

// 调用函数
var cookie_val = getCookie("username");

上面例程里的 cookie_val 变量可以用来生成动态内容,或者发送给服务器端CGI脚本进行处理。现在你知道了使用Javascript脚本操纵cookies的基本方法。但是,如果 你跟我一样,那么我们要做的第一件事,就是建立一些接口函数,把cookies处理上的麻烦隐藏起来。不过,在你开始编程之前,稍候片刻。这些工作,早就 有人替你做好了。你要做的,只是到哪去找这些接口函数而已。

比如,在David Flangan的Javascript: The Definitive Guide 3rd Ed.这本书里,可以找到很好的cookie应用类。你也可以在Oreilly的WEB站点上找到这本书里的例子。本文最后的链接列表里,有一些访问这些 cookie示例的直接链接。

Cookies 怪兽

因为某些原因Cookies 的名声很不好。许多人利用cookies做一些卑鄙的事情,比如流量分析、点击跟踪。Cookies 也不是非常安全,特别是没有secure属性的cookies。不过,即使你用了安全的cookies,如果你和别人共用计算机,比如在网吧,那么别人就 可以窥探计算机硬盘上未加密保存的cookie文件,也就有可能窃取你的敏感信息。所以,如果你是一个WEB开发人员,那么你要认真考虑这些问题。不要滥 用cookies。不要把用户可能认为是敏感的数据保存在cookies里。如果把用户的社会保险号、信用卡号等保存在cookie里,等于把这些敏感信 息放在窗户纸下,无异于把用户投到极大危险之中。一个好的原则是,如果你不想陌生人了解你的这些信息,那就不要把它们保存在cookies里。

另外,cookies还有一些实际的限制。Cookies保留在计算机上,不跟着用户走。如果用户想换计算机,那么新计算机无法得到原来的cookie。 甚至用户在同一台计算机上使用不同浏览器,也得不到原来的cookie:Netscape 不能读取Internet Explorer 的cookies。

还有,用户也不愿意接受cookies。所以不要以为所有的浏览器都能接受你发出的cookies。如果浏览器不接受cookies,你要保证自己的WEB站点不致因此而崩溃或中断。

另外WEB 浏览器能保留的cookies不一定能超过300个。也没有标准规定浏览器什么时候、怎么样作废cookies。所以达到限制时,浏览器能够有效地随机删 除cookies。浏览器保留的来自一个WEB服务器上的cookies,不超过20个,每个cookie的数据(包括名称和值),不超过4K字节。(不 过,本文里的cookie尺寸没问题,它只占了12 K字节,保存在3个3 cookies里。)

简而言之,注意保持cookie简单。不要依赖cookies的存在,不要在每个cookie里保存太多信息。不要保存太多的cookes。但是,抛除这些限制,在技巧高超的WEB管理员手里,cookie的概念是一个有用的工具。

外部链接
每个 Javascript 程序员都应当有一份Javascript: David Flanagan 的The Definitive Guide。 这本书里找到cookie 类例程可以帮助你把不止一个变量编码到单一的cookie,克服掉“每个WEB服务器20 个cookies的限制”。

Read: 214

[转][MS]使用JS读取XML文件

我的xml文件Login.xml如下.

<?xml version="1.0" encoding="utf-8" ?>
<Login>
    
<Character>
        
<C Text="热血" Value="0"></C>
        
<C Text="弱气" Value="1"></C>
        
<C Text="激情" Value="2"></C>
        
<C Text="冷静" Value="3"></C>
        
<C Text="冷酷" Value="4"></C>
    
</Character>
    
<Weapon>
        
<W Text="光束剑" Value="0"></W>
        
<W Text="光束配刀" Value="1"></W>
    
</Weapon>
    
<EconomyProperty>
        
<P Text="平均型" Value="0"></P>
        
<P Text="重视攻击" Value="1"></P>
        
<P Text="重视敏捷" Value="2"></P>
        
<P Text="重视防御" Value="3"></P>
        
<P Text="重视命中" Value="4"></P>
    
</EconomyProperty>
</Login>

现在我需要对这个xml文件的内容进行操作.
首先,我们需要加载这个xml文件,js中加载xml文件,是通过XMLDOM来进行的.

// 加载xml文档
loadXML    = function(xmlFile)
{
    
var xmlDoc;
    
if(window.ActiveXObject)
     {
         xmlDoc    
= new ActiveXObject(‘Microsoft.XMLDOM’);
         xmlDoc.async    
= false;
         xmlDoc.load(xmlFile);
     }
    
else if (document.implementation&&document.implementation.createDocument)
     {
         xmlDoc    
= document.implementation.createDocument(”, ”, null);
         xmlDoc.load(xmlFile);
     }
    
else
     {
        
return null;
     }
    
    
return xmlDoc;
}

xml文件对象出来了, 接下去我就要对这个文档进行操作了.
比如说,我们现在需要得到节点Login/Weapon/W的第一个节点的属性,那么我们可以如下进行.

// 首先对xml对象进行判断
checkXMLDocObj    = function(xmlFile)
{
    
var xmlDoc    = loadXML(xmlFile);
    
if(xmlDoc==null)
     {
         alert(‘您的浏览器不支持xml文件读取,于是本页面禁止您的操作,推荐使用IE5.0以上可以解决此问题
!‘);
         window.location.href
=/Index.aspx’;
     }
    
    
return xmlDoc;
}

// 然后开始获取需要的Login/Weapon/W的第一个节点的属性值
var xmlDoc    = checkXMLDocObj(‘/EBS/XML/Login.xml’);
var v    = xmlDoc.getElementsByTagName(‘Login/Weapon/W’)[0].childNodes.getAttribute(‘Text’)

而我在我的程序中的写法是这样子的,当然我在程序中的写法是已经应用到实际中的了.一并给出来,以供查看

initializeSelect    = function(oid, xPath)
{
    
var xmlDoc    = checkXMLDocObj(‘/EBS/XML/Login.xml’);
    
var n;
    
var l;
    
var e    = $(oid);
    
if(e!=null)
     {
         n    
= xmlDoc.getElementsByTagName(xPath)[0].childNodes;
         l    
= n.length;
        
for(var i=0; i<l; i++)
         {
            
var option    = document.createElement(‘option’);
             option.value    
= n[i].getAttribute(‘Value’);
             option.innerHTML    
= n[i].getAttribute(‘Text’);
             e.appendChild(option);
         }
     }
}

上面的访问代码中,我们是通过xmlDoc.getElementsByTagName(xPath)来进行的.
还可以通过xmlDoc.documentElement.childNodes(1)..childNodes(0).getAttribute(‘Text’)进行访问.
一些常用方法:
xmlDoc.documentElement.childNodes(0).nodeName,可以得到这个节点的名称.
xmlDoc.documentElement.childNodes(0).nodeValue,可以得到这个节点的值. 这个值是来自于这样子的xml格式:<a>b</b>, 于是可以得到b这个值.
xmlDoc.documentElement.childNodes(0).hasChild,可以判断是否有子节点

根据我的经验,最好是使用getElementsByTagName(xPath)的方法对节点进行访问,因为这样子可以直接通过xPath来定位节点,这样子会有更好的性能.

Read: 862