perl教程021

perl教程021 - 下载 第21 学时...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: 下载 第21 学时 cookie 在第 1 9 学时中,我们讲述了如何使用 H T M L中的隐藏域使你的 We b浏览器记住各个 We b之 间的信息。你必须理解这个进程,因为从 CGI程序的一个实例到另一个实例,有时需要在它们 之间传递信息。进行这项操作的唯一方法是将一些信息存储在浏览器中。 将信息存储在浏览器中的另一个方法是使用 HTTP的cookie。正如它的名字所表示的那样, HTTP Cookie 是指在 H T T P 连接期间浏览器与 C G I程序之间传递的信息。使用 Co o k i e ,可以比 使用 HTML隐藏域更加灵活地用浏览器来存储信息。 在本学时中,你将要学习 • 什么是 cookie。 • 如何编写和检索 cookie。 • 如何处理和避免 cookie的常见问题。 21.1 什么是cookie 可以将 cookie视为电影院的入场券。你可以到电影院购买一张入场券,以便在以后的某个 时间拿着入场券到电影院去看电影。看完电影你就可以离开电影院,往回家路上走,买一点 爆玉米,并做你喜欢做的任何事情。当你准备看电影时,你向电影院的收票员出示电影票。 收票员并不知道你如何、何时和为何购买电影票,但是,只要你持有电影票,收票员就允许 你进入电影院。电影票使持票人有权在以后进入电影院去看电影。 HTTP cookie 只不过是 C G I程序要求浏览器持有的一个信息包。这个信息包可以由另一个 CGI 程序或原来的程序在任何时候回收。当有人要检索正常的 HTML Web页时, cookie甚至可 以重新传回给服务器。 cookie可以包含任何种类的信息,比如关于多页 Web窗体的信息、访问 信息、用户喜欢的信息等。 每当 CGI程序要求创建 cookie 时, cookie可以从服务器传送到浏览器(见图 21-1 ) ,这个进 程称为安装 cookie。 图 21-1 c o o k i e 从 C G I 程序 传送到浏览器 浏览器 Web 服务器 CGI 程序 CGI程序可以在晚些时候回收,以便检索存储在 cookie 中的信息,如图 21-2所示。 图 21- 2 浏 览器将 c o o k i e 送 回到服务器 浏览器 Web 服务器 CGI 程序 240 使用第三部分 将Perl 用于 CGI 下载 cookie因何而得名 在计算机界, cookie是个非常老的术语。它是指例程或程序之间传递的任何一组信息,它 使 c o o k i e的持有者能够执行某项操作。某些类型的 c o o k i e称为神秘的 c o o k i e ,因为它们包含的 数据非常神秘,只有 cookie的发送者和接收者才能理解其含义。 CGI cookie 并不神秘。 21.1.1 如何创建cookie 若要创建 cookie,你可以使用 CGI函数 cookie。cookie函数的句法如下: c o o k i e函数以一种特殊的方式使用参数。调用 c o o k i e 时使用的每个参数都带有名字。实际 上,在 Perl中以这种方法将参数传递给函数是非常方便的,因为你不必记住参数的顺序,它们 将按你使用它们时的顺序进行命名。 当你用这个句法来调用 c o o k i e函数时,该函数便返回一个 c o o k i e(该 c o o k i e 应该存放在一 个标量变量中) ,然后该 c o o k i e 可以被赋予 C G I 模块的 h e a d e r 函数,以便发送给浏览器。创建 cookie 时必须要的唯一参数是 -value。-name 参数允许同时将若干个 cookie发送给浏览器,而检 索时则可以单个检索,也可以成组检索。其他参数如 - e x p i r e s 、 - p a t h 、 - d o m a i n 和 - s e c u r e 等, 将在下一节介绍。 C G I模块中的 h e a d e r 函数负责管理将 c o o k i e发送给浏览器的实际操作。这意味着必须使用 c o o k i e 函数来创建 c o o k i e,然后紧接着就调用 h e a d e r 函数。在 c o o k i e 和标题发送之前,不应该 将任何其他种类的数据发送给浏览器。 若要使用CGI程序创建一个cookie并将它发送给浏览器,你可以使用类似下面这样的 GI程序: C 当上面这个代码段运行之后,浏览器上就安装了一个称为 s a m p l e的 c o o k i e 。该 c o o k i e包含 了“ This cookie contains no MSG (该 cookie不包含任何消息) ”这样一个信息。 实际上该 c o o k i e 并没有安装。浏览器可以因为许多原因而拒绝接受某个 cookie。请参见本学时后面部分中的“ cookie 存在的问题”这一节。 若要在你的 C G I 程序中从浏览器中检索 c o o k i e ,可以使用相同的 c o o k i e函数。如下面的例 子所示,如果不带任何参数, cookie 函数返回浏览器拥有的服务器的一个 cookie列表: 241 第21学时 cookie使用 下载 按照默认设置,当 cookie安装在浏览器上之后,它将返回给驻留在同一个服务器上的任何 C G I 程序。也就是说,只有安装 c o o k i e 的服务器才能检索这些 c o o k i e 。若要查看以前创建的 Sample cookie ,可以使用另一个 CGI程序: 上面的代码段使用带有一个参数的 c o o k i e函数,这个参数就是你想查看其值的 c o o k i e的名 字。该值被检索并输出。 cookie应该被浏览器保留到浏览器运行终止。当浏览器重新启动时, cookie sample 将不复 存在。如果你想创建一个比较永久的 c o o k i e,请参见本学时后面部分中的“设置 c o o k i e终止运 行的时间”这一节。 大多数浏览器都配有一个选项,用于在 c o o k i e 被安装时查看这些 c o o k i e 。 在 N e t s c a p e 中,你可以在 A d v a n c e d 选项卡上的 P r e f e r e n c e s 选项下找到查看 c o o k i e的各个选项。在 Internet Explorer 中,这个选项出现在 Internet Options 对话框的 A d v a n c e d选项卡上,还有一个单选按钮可用于控制你是否可以在安 装cookie时查看它们。 21.1.2 举例:使用cookie 使用这个例子,你可以创建一个小程序,让用户可以使用 Web浏览器来设置他查看的 Web 页的颜色。该程序实际上能够同时执行若干项操作: 1) 通过查看程序的各个参数,以便观察默认背景色的变化。 2) 用正确的背景色在浏览器上设置 cookie 。 3) 将Web页的背景色设置为正确的颜色。 4) 显示一个 CGI窗体,使你能够改变其颜色。 程序清单 21-1包含改变颜色的程序。 程序清单 21-1 ColorChanger 程序的完整清单 242 使用第三部分 将Perl 用于 CGI 下载 第7 ~ 1 0 行:如果该程序作为 C G I窗体的目标程序来调用,那么 p a r a m( c o l o r’ ‘ )函数值返 回一个定义的值,即一个新颜色。否则,它不返回任何值, $ r e q u e s t e d _ c o l o r 则保持未设定状 态。 第1 2 ~ 1 4行:这些行用于检索名叫 b g c o l o r的 c o o k i e。它可能存在,也可能不存在。如果它 不存在,那么它存放在 $old_color 中,这是上次保存到 cookie中的屏幕颜色值。 第15~19 行:如果颜色已经改变(即 cookie的值与新值不一致) ,那么新 cookie必须用新值 进行设置。 第2 0 ~ 2 4 行:否则,输出一个纯标题,不带 c o o k i e。请记住,浏览器将无限期保留以前的 cookie。 第25~42行:这些代码行用于创建一个标准 HTML窗体。不过请注意第 30行,在这一行上, 被取代的颜色被送入 HTML输出。 21.1.3 另一个例子:cookie查看器 程序清单 2 1 - 2 中列出的一个非常短的程序是个 c o o k i e 查看器,它用于帮助你调试使用 c o o k i e的 C G I 程序。它列出了存储在 We b 浏览器上的所有 c o o k i e,这些 c o o k i e 恰好来自同一个 Web服务器。 243 第21学时 cookie使用 下载 程序清单 21-2 Cookie 查看器 第10行:用 cookie函数检查所有 cookie的名字,并赋予 $cookie,每次检索 1个cookie。 第11~12 行:输出每个 cookie的名字和值。 该c o o k i e 查看器运行时,可以获取使用 c o o k i e ()函数能够得到的所有 c o o k i e的列表,然 后对这些名字迭代运行 cookie ,输出每个 cookie的名字和值 21.2 高级cookie特性 c o o k i e的基本概念简单明了,你将 c o o k i e赋予浏览器,过一会儿浏览器又将它送回给服务 器。不过 c o o k i e的基本特性并不止此。可以将 c o o k i e设置为可以存在较长的时间,这种 c o o k i e 称为永久性 c o o k i e 。你可以让这些 c o o k i e只返回到另一个特定的 U R L,它们能够指明关于你的 连接的安全程度之类的信息。 21.2.1 设置cookie终止运行的时间 到现在为止,你在浏览器上安装的 c o o k i e 都是临时的。一旦浏览器关闭, c o o k i e 就消失。 当你使用 c o o k i e将值保存在窗体上的多个页中(而不是保存隐藏的 H T M L 值)时,使用临时 c o o k i e是完全合适的。当一个新浏览器启动时,你不想让 c o o k i e返回给服务器,因为用户不会 从中间开始填写窗体,他将再次从头开始时填写。 在有些情况下,你可能希望 cookie能够保留更长的时间。也许你想在浏览器关闭和重新启 动之后使 cookie持续数天、数周、数月时间。用 Perl的CGI模块来创建这种 cookie是非常容易的。 若要为 c o o k i e设置一个终止日期,可以在创建 c o o k i e 时使用 - e x p i r e s 选项。 - e x p i r e s选项必 须后随一个想使 cookie终止运行的日期。可以如表 21-1所示用若干种格式设置这个日期。 表21-1 cookie 的终止日期格式 格 式 秒数 分钟数 小时数 月数 年数 任何负时间值 一个特定时间 示 例 +30s +15m +12h +6M +1Y now -10m Saturday,28-Aug-1999 22:51:05 GMT 含 义 从现在起 30 秒后终止 从现在起 15 分钟后终止 从现在起 12 小时后终止 从现在起 6 个月后终止 从现在起 1 年后终止 cookie 立即终止运行 cookie立即终止运行 244 使用第三部分 将Perl 用于 CGI 下载 当设定一个特定时间时,必须完全使用表 2 1 - 1 中列出的时间格式。所有其他的各种设置 值都是指从当前时间起的时间偏移量。系统将为你计算出完全合格的时间值,然后发送给浏 览器。 下面这个小程序用于在浏览器上安装一个将在 8天后终止运行的 cookie: 21.2.2 cookie的局限性 要使 c o o k i e 能够永久运行是做不到的。这就是说,如果将一个 c o o k i e发送给浏览器,希望 从现在起该 cookie能够在数周、数月或者数年内保持运行,那么你一定会大失所望的。 当你读到后面的“ c o o k i e 存在的问题”这一节内容时,就会知道浏览器并不是必须将 c o o k i e 存储起来的。实际上,它们根本不必接受你的 c o o k i e ,它们并不通知你这些 c o o k i e并没 有保留起来。 浏览器可以随时清除它们的 c o o k i e ,以便为来自其他站点的新 c o o k i e腾出地方,或者根本 毫无理由就这样做了。有些浏览器允许用户编辑 cookie ,或者添加新的 cookie。 用户可能不小心删除 c o o k i e,也可能故意将 c o o k i e 删除掉。如果用户安装了浏览器或操作 系统的新版本, c o o k i e就会被清除,或者放到别的什么地方。只要改用另一种浏览器, c o o k i e 就会“不知去向” 。当浏览器尚未激活时, c o o k i e 通常存放在一个文件中,该文件可以供用户 编辑,删除,或者遭到损坏。 如果你有兴趣的话,我们可以告诉你,大多数浏览器是在没有激活时将 c o o k i e 存放在文件中的,这些文件通常是文本文件,你可以使用编辑器查看 这些文件。 N e t s c a p e 将c o o k i e存放在用户主目录下的 c o o k i e s . t x t 文件中(不同 的系统下该目录将各不相同) Internet Explorer 将 c o o k i e 存放在 \ Wi n d o w s \ 。 Cookies下。 因此,将重要信息存放在一个 HTTP cookie 中真的不是个好主意。你想永久存放在 c o o k i e 中的任何信息不应该被轻易改变位置,这些信息包括用户喜欢的信息,输入指定 We b 页可 替换项目关键字,上次刚刚访问的信息等。 21.2.3 将cookie发送到其他地方 按照默认设置, c o o k i e只能送回到曾经发出 c o o k i e的服务器。有时,你希望将 c o o k i e 送回 到服务器,但有时你并不希望如此。以神秘的 We b 站点 C o n g o . c o m 为例,这个销售书籍的 We b 站点拥有两个 We b服务器,即 w w w. c o n g o . c o m 和s h o p p i n g . c o n g o . c o m ,如图 2 1 - 3 所示。主要的 Web站点( www.congo.com)包含公司的所有信息,可以连接到其他站点,并且最重要的是可 245 第21学时 cookie使用 下载 以连接到在线书店。 图21-3 两个互相连接的 Web 站点 Web服务器 Web 服务器 HTML 链接 www: congo.com shopping congo.con www.congo.com 包含一个注册用的 H T M L窗体/ C G I程序,使用户可以将他们的名字添加 到电子邮件的地址列表,设置他们喜欢什么类型的书籍。以后,当用户浏览 w w w. c o n g o . c o m 时,他就可以阅读关于他感兴趣的新书的信息。用户浏览器上的 c o o k i e 负责告诉 w w w. congo.com ,应该向他介绍哪些书籍的情况(见图 21-4) 。 图 21-4 只 返回给单个 We b 站点的 cookie 浏览器 Cookie 域 www: congo.com 服务器 服务器 www: congo.com shopping congo.con 问题是当用户从 w w w. c o n g o . c o m 转到位于 s h o p p i n g . c o n g o . c o m 站点上的在线书店时, cookie 没有被发送到 shopping.congo.com服务器。 HTTP cookie 只返回给原先发送 cookie的这个 服务器。如果 www.congo.com发送了该 cookie ,它并不发回给 shopping.congo. com。 那么你应该怎么办呢?如果让用户填写另一个首选项窗体,并且从 s h o p p i n g . c o n g o . c o m给 他发送一个新 c o o k i e ,那将是不切实际的。更好的办法是限制这个 c o o k i e只能使用一个特定的 域名。例如,当原始 c o o k i e 从 w w w. c o n g o . c o m 发送出来时,可以将该 c o o k i e 送回给任何 congo.com Web站点,如图 21-5 所示。 图 21-5 返 回给两个 We b 站 点的 cookie 浏览器 Cookie 域 www. congo.com Web 服务器 www. congo.com Web 服务器 shopping congo.com Web 服务器 www. foo. com 若要进行上述操作,可以在创建 cookie时使用带有 -domain 参数的 cookie函数: 246 使用第三部分 将Perl 用于 CGI 下载 在上面这个代码段中, cookie $ c o o k i e得以创建,并且限制为 c o n g o . c o m 域。任何 We b 服 务器,如果其主机名以 congo.com为结尾,将使它的 cookie 由浏览器返回给该服务器。 域的参数至少必须由两个部分组成,并且不能是绝对的顶层域,即 . c o m 或 . n e t 。这样,就可以避免浏览器将 c o o k i e 从一个 . c o m 域移植到另一个 . c o m 域。 21.2.4 限制cookie返回到的位置 将c o o k i e限制为只能返回到某个服务器,这也是可能的。当你创建一个 c o o k i e时,按照默 认设置,该 cookie可以返回到 Web 站点上的任何 URL,包括非 CGI URL 。例如,如图 21-6所示 的汽车销售 Web 站点的组织结构。 图 21-6 一 个多用户 We b 站 点的目录树结构 让s a l e s(销售) C G I 程序和 e n g i n e e r i n g(工程设计) C G I 程序驻留在不同的目录中,是有 意义的。如果 sales CGI 程序准备建立一个 c o o k i e,那么 engineering CGI 程序便将它接收过来, 反过来也一样。这样的结果是人们所不希望的,为两个站点同时编写 CGI程序的开发人员必须 采取协调措施,以确保不会重复使用对方的 cookie名字。 为了解决这个问题,可以使用 cookie 函数的 -path选项。该选项用于指明 cookie应该返回到 的路径名(相对于 URL顶层的路径名) 。例如,若要发送只返回到 sales CGI 程序的一个 cookie, 可以使用下面的代码段: 按照默认设置, c o o k i e 返回到服务器上的每个站点,就像已经使用了选项 - p a t h = > ‘/’ 一样。若要限制只能返回到一个 CGI程序,可以在 -path选项中使用 CGI程序的 URL: 上个学时中我们讲过, C G I 模块中的 s c r i p t _ n a m e函数能够返回当前 C G I程序的部分 U R L 。 这可以有效地创建这样一个 cookie ,它只返回到在浏览器上安装该 cookie的程序。 下载 247 第21学时 cookie使用 21.2.5 带有安全性的cookie 有些 c o o k i e 你可能只想在一条安全的连接上传输它们。使用 c o o k i e函数的 - s e c u r e参数,就 可以只在连接是安全的时候从浏览器发送 c o o k i e 。下面的代码用于将一个包含账号的 c o o k i e发 送给浏览器。包含此类敏感信息的 cookie只能在安全的连接上发送。 以后,如果你要检索该 cookie,只要像平常那样使用 cookie 函数即可。如果连接是安全的, 而且该 cookie是在该浏览器上,那么该浏览器就可以在需要时将 cookie 发回给服务器。 你不应该依赖这个方法来检查连接是否安全,也不应该依赖账号的准确性。请记住,用 户负责控制 We b 浏览器及其 c o o k i e文件。 c o o k i e 可以在不安全的连接上发回给服务器,甚至可 以有一个无效号码。 21.3 cookie存在的问题 在你将cookie投入应用之前,应该知道与 cookie相关的一些问题。由于这些原因和将来可能 产生的其他原因,你应该认真设计你的Web页和CGI程序,使得cookie完全成为可以选择的选项。 例如,如果你使用 c o o k i e 来存放用户的首选项,那么倘若 c o o k i e无法使用,你应该使用一 组默认首选项。编码时请采取相应的防范措施。 21.3.1 cookie的生存期很短 本学时中多次讲到, cookie的寿命很短。 Cookie 可以从用户的系统中删除,可以由用户编 辑,也可以毫无理由地被浏览器甩掉。 浏览器可以接受 cookie,将它使用一会儿,然后毫无理由就将它忘掉。如果你使用 -expire 选项安装了一个永久性 cookie ,浏览器仍然可以甩掉这个 cookie,并且根本不通知用户。 21.3.2 并非所有浏览器都支持cookie 并非所有浏览器都支持 HTTP cookie ,这是千真万确的事实。适用于 H T T P 和We b 信息传 输的 Internet 标准并不能保证浏览器必须支持 cookie。 并不是说大多数浏览器都不支持 c o o k i e ,大多数浏览器是支持 c o o k i e的。 N e t s c a p e(自从 1 . 1版以来) Internet Explorer (所有版本) Ly n x , O p e r a,以及大多数流行的 We b 浏览器都支 , , 持cookie。在大多数浏览器中,有一个选项可供用户关闭对 cookie 的支持。 即使你使用 C G I模块的 u s e r _ a g e n t 函数,确定你想使用的浏览器应能支持 c o o k i e,也不要 完全指望它。 21.3.3 有些人不喜欢cookie 这一节的标题也许很难理解,为什么世界上竟然有人不喜欢 cookie呢? 248 使用第三部分 将Perl 用于 CGI 下载 在 We b 上冲浪实际上是一种匿名活动。正如你在上一学时中看到的那样,当浏览器要求 检索一个 We b 页时,这个检索请求是在真空中发生的。服务器不一定知道浏览器所在的位置, 也不知道该浏览器上次曾经要求检索过该站点上的一个 Web页。 请记住,一个浏览器不一定代表一个用户,一个浏览器可以被一个家庭、 网吧、 I n t e r n e t网吧或公共访问点(如图书馆)中的许多人共享。为一个人安 装(或修改)一个 cookie,实际上也为若干人安装了 cookie。 cookie可以用来跟踪人们曾经访问过某个站点的哪个位置以及他们曾经点击过什么。如果 你非常在乎隐私问题,那么这个情况你应该注意。 例如,前面的“将 c o o k i e 发送到其他地方”这一节中我们提到的一个虚构在线书店 c o n g o . c o m能够跟踪 We b冲浪者点击了哪些书籍以便了解其详细信,并使用该信息编写符合 读者需要的书目,提供给 Web冲浪者。 从表面上看,这些特性很好。但是对于那些想要维护隐私权的人来说,这会带来两个问 题。首先,现在有一个机构负责跟踪 We b 冲浪者感兴趣的是什么种类的书籍。如果这些信息 与 We b冲浪者的名字和地址有关(也许这些信息是从 c o n g o . c o m 共享信息的另一个站点的填写 式窗体中获得的) ,那么 We b 冲浪者将会收到与他选购书籍相关的垃圾邮件。与 c o o k i e搜集站 点共享的信息越多,就能获得关于 Web 冲浪者更详细的信息。 除了隐私问题外,如果 Web冲浪者查看的头两本书属于“计算机”书籍, Web站点就会停 止向 We b冲浪者提供“传奇”类和“烹饪”类书籍。 We b站点将把 We b冲浪者“转移”到他们 想要的书籍类别。 你会惊奇地发现 c o o k i e 是多么频繁地用来在你的浏览器上搜集和存储信 息。请打开你的浏览器上的 cookie确认特性,以便访问流行的 Web站点。 为了避开对 c o o k i e的使用,人们想了多办法。支持 c o o k i e 的We b浏览器均配有关闭 c o o k i e 的特性,有些浏览器在安装 c o o k i e时允许你查看这些 c o o k i e。可以使用某些辅助软件包对发送 到浏览器和浏览器返回的 cookie 进行筛选,还可以对它们进行编辑。 Web站点的设计使你可以 对其他 Web站点进行匿名冲浪,而 cookie不会搜集关于你的信息。 总之,有些人将HTTP cookie视为侵犯隐私权的一个特性,因此你在使用cookie时应该慎重。 21.4 课时小结 在本学时中,我们全面介绍了如何使用 HTTP cookie 在浏览器上存储信息,供别的 CGI程序 在以后使用。还介绍了按照预定时间使 cookie终止运行,仅为特定 Web服务器激活,或者为特定 目录激活cookie等特性。最后,讲述了不使用 cookie的许多理由以及使用 cookie会带来的问题。 21.5 课外作业 21.5.1 专家答疑 问题: 我应该如何将多个项目放入一个 HTTP cookie ? 下载 249 第21学时 cookie使用 解答: 最容易的方法是将多个项目组合在单个 cookie中,用域分隔符将各个项分开,如下 例所示: 然后,当你检索 cookie时,可以使用 Split 将各个项目分开: 问题: 如何使用 cookie来跟踪用户在 Web 页上点击了哪些链接? 解答: 在解答这个问题之前,必须指出,有些人将这种跟踪视为是侵犯他人的隐私权。 说明这一情况后,再来说明跟踪的一般方法: 1) 编写你的< A HREF >链接,将它们纳入一个 CGI程序,将真实的目标 URL作为参数来 传递: 2) 上例中的 r e d i r e c t . p l程序应该使用 C G I 模块的 p a r a m 函数,以便从参数 t a rg e t中获得真实 的URL(http://www. congo.com ) : 3) 然后使用该值中的目标 URL创建一个 cookie,其名字你可以在以后查看,如下所示: 4) 然后将重定向的项目与 cookie一同发送给浏览器: 以后,当浏览器返回到你的 We b 站点时,你就可以查找名字为 t r a c k e r的 c o o k i e,它包含了 用户退出你的站点时访问过的 URL。 问题: 我在传送 cookie时能够将浏览器重定向到另一个 Web页吗? 解答: 当然可以。 CGI模块的 redirect函数也能像 header函数那样带有一个 -cookie参数。 21.5.2 思考题 1) 用cookie来长期存储信息,为什么有时会失败? a. 浏览器会“甩掉” cookie的信息。 b.软件更新时 cookie可能丢失。 250 使用第三部分 将Perl 用于 CGI 下载 c.用户可能关闭浏览器对 cookie 的支持。 2) 若要使 cookie 在一周后终止运行, cookie函数的 -expire 选项应该使用什么参数? a. +7d b. +1w c. +10080m 3) 为什么有些人认为 cookie 会侵犯隐私权? a. cookie 可以用来跟踪用户点击的链接。 b. 被跟踪的 cookie 信息可以共享,以便建立关于用户的档案资料。 c. cookie 信息可用于将某些类别的信息“传递”给用户。 21.5.3 解答 1) 3 个答案均成立。 2) a 和c 均成立。参数 +1w无效。 3) 3 个答案均成立。 21.5.4 实习 • 扩展背景色修改程序,以便设置前景色和字体,并随机选定一个图形,以便显示在 We b 页上,方法是编辑< IMG >标记的目标对象。 下载 251 第21学时 cookie使用 ...
View Full Document

This note was uploaded on 11/27/2011 for the course CS Perl taught by Professor Guo during the Spring '09 term at Xiamen University.

Ask a homework question - tutors are online