在CGI中如何使用cookie

来源:互联网 发布:2007年美国进出口数据 编辑:程序博客网 时间:2024/05/16 06:56
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";的头部输出语句,否则程序会报错

0 0
原创粉丝点击