正 文

在CGI中如何使用cookie


www.7dspace.com  更新日期:2005-8-17 2:47:55  七度空间


  cookie概述:
  在http协议一个很大的缺点就是不作用户身份的判断,这样给编程人员带来很大的不便,
  而cookie功能的出现弥补了这个缺憾。
  所有cookie就是在客户访问脚本的同时,通过客户的浏览器,在客户硬盘上写入纪录数据
  ,当下次客户访问脚本时取回数据信息,从而达到身份判别的功能,cookie常用在密码判断中
   
  cookie的语法:
  http cookie的发送是通过http头部来实现的,他早于文件的传递,头部set-cookie的语法如下:
  Set-cookie:name=name;expires=date;path=path;domain=domain;secure
  name=name: 需要设置cookie的值(name不能使用“;”和","号),有多个name值时用";"分隔例如:name1=name1;name2=name2;name3=name3。

  

  expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"

  path=path: 设置cookie支持的路径,如果path是一个路径,则cookie对这个目录下的所有文件及子目录生效,例如: path="/cgi-bin/",如果path是一个文件,则cookie指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。

  domain=domain: 对cookie生效的域名,例如:domain="www.chinalb.com"

  secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。

    cookie的接收是通过设置环境变量HTTP_COOKIE来实现的,CGI程序可以通过检索该变量获取cookie信息。
   
  cookie的模块:
  以下是一个cookie的模块,可以为你编写程序带来方便
  #########代码开始
  ###############################################################################
  # HTTP Cookie Library Version 2.1 #
  # Copyright 1996 Matt Wright mattw@worldwidemart.com #
  # Created 07/14/96 Last Modified 12/23/96 #
  ###############################################################################
  $Cookie_Exp_Date = 'Thu, 31-Dec-2050 23:00:00 GMT'; #此处设置cookie的有效时间
  $Cookie_Path = ''; #此处设置cookie的有效路径,默认脚本存在的目录。
  $Cookie_Domain=''; #此处设置cookie的有效域名,默认脚本调用的域名。

  @Cookie_Encode_Chars = ('%', '+', ';', ',', '=', '&', '::', 's');
  %Cookie_Encode_Chars = ('%', '%25',
  '+', '%2B',
  ';', '%3B',
  ',', '%2C',
  '=', '%3D',
  '&', '%26',
  '::', '%3A%3A',
  's', '+'); # 特殊字符的解码

  @Cookie_Decode_Chars = ('+', '%3A%3A', '%26', '%3D', '%2C', '%3B', '%2B', '%25');
  %Cookie_Decode_Chars = ('+', ' ',
  '%3A%3A', '::',
  '%26', '&',
  '%3D', '=',
  '%2C', ',',
  '%3B', ';',
  '%2B', '+',
  '%25', '%'); # 特殊字符的解码
  ###################################3

  #获取cookie信息

  ###############################################################################
  # GetCookies #
  ###############################################################################
  sub GetCookies {
  local(@ReturnCookies) = @_;
  local($cookie_flag) = 0;
  local($cookie,$value);
  if ($ENV{ 'HTTP_COOKIE'}) {
  foreach (split(/; /,$ENV{ 'HTTP_COOKIE'})) { #分割HTTP_COOKIE变量的字符串
  ($cookie,$value) = split(/=/);
  foreach $char (@Cookie_Decode_Chars) {
  $cookie =~ s/$char/$Cookie_Decode_Chars{ $char}/g; #调用转码函数
  $value =~ s/$char/$Cookie_Decode_Chars{ $char}/g; #调用转码函数
  }
  $Cookies{ $cookie} = $value;
  }
  $cookie_flag = 1;
  }
  return $cookie_flag;
  }

    # 设置Cookie信息
  ###############################################################################
  # SetCookies #
  ###############################################################################
  sub SetCookies {
  if ($HeaderDefine ne "TRUE") {
  print "Content-type: text/htmln"; # 浏览器头部信息开始
  local(@cookies) = @_;
  local($cookie,$value,$char);

  while( ($cookie,$value) = @cookies ) {
  foreach $char (@Cookie_Encode_Chars) {
  $cookie =~ s/$char/$Cookie_Encode_Chars{ $char}/g; #调用转码函数
  $value =~ s/$char/$Cookie_Encode_Chars{ $char}/g; #调用转码函数
  }
  print 'Set-Cookie: ' . $cookie . '=' . $value . ';'; #设置cookie值
  if ($Cookie_Exp_Date) {
  print ' expires=' . $Cookie_Exp_Date . ';'; #设置有效时间
  }
  if ($Cookie_Path) {
  print ' path=' . $Cookie_Path . ';'; #设置有效路径
  }

  if ($Cookie_Domain){
  print ' domain=' . $Cookie_Domain . ';'; #设置有效域名
  }
  print "n"; #浏览器头部信息结束
  shift(@cookies); shift(@cookies);
  }
  $HeaderDefine = "TRUE";
  }
  }

  1; #return true

  ##########代码结束

  模块的调用方法:

  设置cookie:
  &SetCookies('NAME', $name, 'PASS', $pass); #设置NAME 和PASS两个cookie值.

  取cookie:

  &GetCookies;
  $name=$Cookies{ 'NAME'};
  $pass=$Cookies{ 'PASS'};

   
  Cookie使用的注意事项:
  发送cookie时由于是通过http头发送的,而http头部只能发送一次,因此在使用cookie模
  快时不能再使用 print "Content-type: text/htmlnn";的头部输出语句,否则程序会报错


上一篇:Perl语言的文字处理模式
下一篇:在 WIN9X 系统下轻松调试 LINUX 操作系统下的 CGI 程序
作者:  来源:七度空间 ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐