|
|
用户名:ruzhiwei 笔名:蓝血[天涯] 地区: 北京-北京 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
我的地盘听我的!
java的RSS处理
mysql授权对其它机器的访问
linux下mysql5的安装
花了1天,在Debian Etch Linux上成功安装了MySQL 5.0.27 icc版本,并使用JDBC测试中文成功!
中文问题的关键是全部使用UTF-8编码,MySQL 5发布版支持UTF-8,但默认为latin1,Java在内部使用的全部是Unicode,因此要保证JSP页面以UTF-8编码,JDBC驱动采用官方Connector4J 5.0.4,在Resin 3.1/Spring 2.0/Hibernate 3.2环境下测试中文正常。
1. 下载"mysql-standard-5.0.27-linux-i686-icc-glibc23.tar.gz",推荐ICC版本,据称比GCC性能提高10-20%
2. 复制到/usr/local/,解压:tar zxvf mysql-standard-5.x....tar.gz
3. 添加用户和组mysql:
groupadd mysql
useradd -g mysql mysql
4. 创建符号连接:/usr/local # ln -s mysql-standard-5.x... mysql
5. cd mysql,当前目录改为/usr/local/mysql/
6. 运行脚步初始化数据库:./scripts/mysql_install_db --user=mysql
7. 设置权限:
/usr/local/mysql # chown -R root .
/usr/local/mysql # chown -R mysql data
/usr/local/mysql # chgrp -R mysql
8. 根据需要创建并修改/etc/my.cnf,参考配置:
[mysqld]
# 设置默认为INNODB表,支持事务:
default-storage-engine=INNODB
# 设置默认的字符集UTF-8:
character-set-server=utf8
collation-server=utf8_general_ci
default-character-set=utf8
# 禁用bdb:
skip-bdb
9. 启动MySQL:
/usr/local/mysql/bin # ./mysqld_safe --user=mysql &
10. 初始化root口令:
/usr/local/mysql/bin # ./mysqladmin -u root -p password "password-of-root"
Enter password: <输入旧口令,直接按Enter>
11. 以root登录创建数据库:
/usr/local/mysql # ./mysql -u root -p
Enter password: password-of-root
12. 创建一个新用户:
mysql> create user test identified by 'test-password';
13. 创建一个新数据库:
mysql> create database testdb default character set utf8 default collate utf8_general_ci;
务必指定字符集和排序方式,均为UTF-8,这样才能保证创建的表也使用UTF-8。
14. 赋予test用户从localhost访问testdb的权限,并使用口令:
mysql> grant all on testdb.* to test@localhost identified by 'test-password';
注意:要使用JDBC从远程连接MySQL,就必须正确设置test用户权限,MySQL的访问权限由用户名,客户端机器名和口令共同组成,上例表示仅允许test用户在本机(localhost)通过口令连接MySQL。
15. 停止MySQL服务器:
/usr/local/mysql/bin # ./mysqladmin -u root -p shutdown
Enter password: password-of-root
STOPPING server from pid file /usr/local/mysql/data/debian.pid
xxx mysqld ended
中文秘籍:
/etc/my.cnf中所有与编码相关的设置均要设定为UTF-8,参考步骤8。
按以下步骤调试:
mysql> status;
注意characterset相关值,必须保证全部为utf8,否则,修改/etc/my.cnf,参考步骤8。
mysql> show variables like '%char%';
除了character_set_filesystem显示为binary外,其余应该全部显示为utf8,若非utf8,修改/etc/my.cnf,参考步骤8。
mysql> show variables like '%collation%';
显示应该全部为utf8_general_ci,否则,修改/etc/my.cnf,参考步骤8。
mysqlshow -u root -p -i database-name
作用:显示数据库详细信息,如果你没有看到utf8_general_ci,而是latin_swedish_ci,说明数据库编码非UTF-8,中文肯定不正常,删之,然后参考步骤13以UTF-8重新创建数据库。
mysql 字符集
mysql 字符集
一. 显字符集
mysqladmin -uroot -proot variables | grep character
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
数据库缺省使用latin1 (ISO-8859)
二. 配置字符集
1. 建库时配置字符集
create database testxxx default charset=utf8
3. 建表时配置字符集
CREATE TABLE `t_agent` (
`ID` smallint(5) NOT NULL
) DEFAULT CHARSET=utf8 ;
4. 修改字符集
Windows平台
windows下的mysql配置文件是my.ini,一般在c:\windows\my.ini或者c:\winnt\my.ini可以直接在这个文件里面加上
default-character-set=gbk #或gb2312,big5,utf8
然后重新启动mysql
service mysql restart
或
/etc/init.d/mysql restart
或用其他方法重新启动,就生效了。
[编辑]Unix平台
linux下的mysql配置文件是my.cnf,一般是/etc/my.cnf,如果找不到可以用find命令找一下:
find / -iname my.cnf
在这个文件里面加上
default-character-set=gbk #或gb2312,big5,utf8
然后重新启动mysql
三. 配置排序字符集
myisamchk -r -q --set-character-set=charset
Mysql 数据库字符集转换及版本升/降级教程
| 最近discuz发布了新的版本,免费了,用的人更多了,以前使用其它论坛程序和discuz2.5/3.0的纷纷转换或升级到discuz4.0,可见discuz作为中国人开发的php论坛程序,确实是非常优秀的,在大家欣喜若狂的时候,也遇到了一些问题 看到不少用户反映转换完以后是乱码的情况,出现这种现象的主要原因是这类用户使用的都是mysql4.1以上的版本.下面作一个说明,希望出现这个问题的朋友都能耐心的把这个文档看完!!! MySQL 4.1开始,对多语言的支持有了很大变化 (这导致了问题的出现)。尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3、4.0 仍然占主导地位;但 MySQL 4.1 乃至5.0是 MySQL 官方推荐的数据库,已经有主机提供商开始提供并将会越来越多;因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题。 MySQL 4.1开始把多国语言字符集分的更加详细,所以导致数据库迁移,或则dz论坛升级到4.0后(dz4.0开始使用gbk或utf-8编码)出现乱码问题。 MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。 查看系统的字符集和排序方式的设定可以通过下面的两条命令: QUOTE: mysql> SHOW VARIABLES LIKE 'character_set_%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 7 rows in set (0.00 sec) mysql> SHOW VARIABLES LIKE 'collation_%'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | latin1_swedish_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+ 3 rows in set (0.00 sec) MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢? 编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1; 安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的; 启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的; 此时 character_set_server 被设定为这个默认的字符集; 当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server; 当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集; 在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集; 当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集; 这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的; 当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。 想要进行“正确”的存储和得到“正确”的结果,最方便的是在所有query开始之前执行一下: SET NAMES 'gbk'; 其中gbk是数据库字符集。 它相当于下面的三句指令: SET character_set_client = gbk; SET character_set_results = gbk; SET character_set_connection = gbk; 4.1和5.0默认使用的是latin1字符集(木头:妈的,老外真霸道,妄想让全世界都是使用瑞典字符集吗) 如果我们只想使用gbk字符集存储和获取数据, 我们在编译mysql 4.1和 5.0的时候,需要注意在my.ini或者my.cnf中添加两处参数 [Copy to clipboard] [ - ] CODE: [mysqld default-character-set=utf8 [Copy to clipboard] [ - ] CODE: #settings for clients (connection, results, clients) [mysql] default-character-set=utf8 下面我们来说主题,如何转换数据库字符集 两种方法, QUOTE: 第一种----更改存储字符集 主要的思想就是把数据库的字符集有latin1改为gbk,big5,或者utf8; 以下操作必须拥有主机权限。假设当前操作的数据库名为:database 导出 首先需要把数据导为mysql4.0的格式,具体的命令如下: mysqldump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse > d4.sql --default-characte-set 以前数据库的字符集,这个一般情况下都是latin1的, --set-charset 导出的数据的字符集,这个可以设置为gbk,utf8,或者big5 导入 首先使用下面语句新建一个GBK字符集的数据库(test) CREATE DATABASE `d4` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 然后把刚才导出的数据导入到当前的数据库中就ok了。 mysql -uroot -p --default-character-set=gbk -f d4<d4.sql 通过以上的导出和导入就把数据库的字符集改为正确的存储方式了。 其中d4为新建库的名称,d4.sql为导出文件的名字 但是这种方法,发现数据库数据存储量无端变大30%,真是郁闷 QUOTE: 另外一种其实原理相同,但是需要手动操作,一般用于第一种方法失败后的选择 不过这种方法如果数据库很大,估计很难做,因为光打开文件就能让你死机 首先还是用phpmyadmin或者用mysql本身的dump导出 .sql文件 然后用UltraEdit打开你备份的所有xxxx.sql文件,查找 [Copy to clipboard] [ - ] CODE: DEFAULT CHARSET=latin1 latin1这里也许是别的,反正是你不想要的,要转成gbk或者big5的字符集 把这个替换为“空” 在查找 [Copy to clipboard] [ - ] CODE: CREATE TABLE cdb_sessions ( sid char(6) character set latin1 collate latin1_bin NOT NULL default '', ip1 tinyint(3) unsigned NOT NULL default '0', ip2 tinyint(3) unsigned NOT NULL default '0', ip3 tinyint(3) unsigned NOT NULL default '0', ip4 tinyint(3) unsigned NOT NULL default '0', uid mediumint(8) unsigned NOT NULL default '0', username char(15) NOT NULL default '', groupid smallint(6) unsigned NOT NULL default '0', styleid smallint(6) unsigned NOT NULL default '0', invisible tinyint(1) NOT NULL default '0', `action` tinyint(1) unsigned NOT NULL default '0', lastactivity int(10) unsigned NOT NULL default '0', fid smallint(6) unsigned NOT NULL default '0', tid mediumint(8) unsigned NOT NULL default '0', nickname char(15) NOT NULL default '', UNIQUE KEY sid (sid) ) ENGINE=HEAP MAX_ROWS=1000; 替换为 [Copy to clipboard] [ - ] CODE: CREATE TABLE `cdb_sessions` ( `sid` char(6) binary NOT NULL default '', `ip1` tinyint(3) unsigned NOT NULL default '0', `ip2` tinyint(3) unsigned NOT NULL default '0', `ip3` tinyint(3) unsigned NOT NULL default '0', `ip4` tinyint(3) unsigned NOT NULL default '0', `uid` mediumint(8) unsigned NOT NULL default '0', `username` char(15) NOT NULL default '', `groupid` smallint(6) unsigned NOT NULL default '0', `styleid` smallint(6) unsigned NOT NULL default '0', `invisible` tinyint(1) NOT NULL default '0', `action` tinyint(1) unsigned NOT NULL default '0', `lastactivity` int(10) unsigned NOT NULL default '0', `fid` smallint(6) unsigned NOT NULL default '0', `tid` mediumint(8) unsigned NOT NULL default '0', `nickname` char(15) NOT NULL default '', UNIQUE KEY `sid` (`sid`) ) TYPE=HEAP MAX_ROWS=2000; 这一步更为简单的办法就是删除掉关于cdb_sessions表的这一段,将来全新装一个d4,将这个表导出 将其内容复制,粘贴到 sql文件的最后面 保存后,再把这个sql文件导入到你的库中 就OK了 用这两种方法就可以很方便的把4.1和5.0的mysql数据库降级到4.0 简单的过程就是 A导出4.1/5.0的库 B进行处理,转换成gbk字符集 C彻底卸载4.1或者5.0 D安装4.0.26 E然后导入处理完的库 降级的时候导出库可以用这个方法 mysqldump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse --compatible=mysql40 > d4.sql 这样导出的就是4.0的库勒 至于mysql版本的升级, 如果数据文件中有中文信息,那么将MySQL 4.0的数据文件,直接拷贝到MySQL 4.1中就是不可以的,即便在my.ini中设置了default-character-set为正确的字符集。虽然貌似没有问题,但MySQL 4.1的字符集有一处非常恼人的地方,以gbk为例,原本MySQL 4.0数据中varchar,char等长度都会变为原来的一半,这样存储中文容量不变,而英文的存储容量就少了一半。这是直接拷贝数据文件带来的最大问题。 所以,升级的根本,如果想使用“正确”的字符集,还是先用mysqldump导出成文件,然后导入。Linux联盟收集整理 | |
[JS]Cookie精通之路
| [JS]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的限制”。请点击这个链接下载该例程,ftp://ftp.oreilly.com/pub/examples/nutshell/javascript/。 |
Get和Post的区别