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.runoob.com” secure:
如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。
cookie的接收是通过设置环境变量HTTP_COOKIE来实现的,CGI程序可以通过检索该变量获取cookie信息。
python的实现方法:
def setCookie():
print "Content-type: text/html\n\n"
c=Cookie.SimpleCookie()
c['session']='admin'
c['session']['max-age']=60*60
print c
return True
def checkCookie():
cookie=Cookie.SimpleCookie()
if os.environ.has_key('HTTP_COOKIE'):
cookie.load(os.environ['HTTP_COOKIE'])
if cookie['session'].value=='admin':
return True
return False
C语言的实现方法:
#include <stdio.h>
#include "cgic.h "
#include <string.h>
#include <stdlib.h>
test1.cgi
int cgiMain()
{
char username[25]= "uuuu ";
char pass[25] = "123 ";
//printf( "Set-Cookie:username=%s;Set-Cookie:password=%s\n ",username,pass);
printf( "Set-Cookie: username=%s; path=/\r\n ", username);
printf( "Set-Cookie: password=%s; path=/\r\n ", pass);
cgiHeaderContentType( "text/html ");
printf( " <a href=test2> 1111 </a> ");
return 0;
}
test2
#include <stdio.h>
#include "cgic.h "
#include <string.h>
#include <stdlib.h>
int cgiMain()
{
cgiHeaderContentType( "text/html ");
printf( "Cookie:%s\n ",getenv( "HTTP-COOKIE "));
return 0;
}
下面是python相对完整的策略:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
print 'Content-Type: text/html'
print 'Set-Cookie: name="菜鸟教程";expires=Wed, 28 Aug 2016 18:30:00 GMT'
print
print """
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h1>Cookie set OK!</h1>
</body>
</html>
"""
以上是设置cookie的情况,下面是检查cookie的情况:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
import os
import Cookie
print "Content-type: text/html"
print
print """
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h1>读取cookie信息</h1>
"""
if 'HTTP_COOKIE' in os.environ:
cookie_string=os.environ.get('HTTP_COOKIE')
c=Cookie.SimpleCookie()
c.load(cookie_string)
try:
data=c['name'].value
print "cookie data: "+data+"<br>"
except KeyError:
print "cookie 没有设置或者已过去<br>"
print """
</body>
</html>
"""
从以上的说明基本可以看出,调用cgi的时候是有一个环境变量传进来的;
变量名 描述
- CONTENT_TYPE 这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。
- CONTENT_LENGTH 如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。
- HTTP_COOKIE 客户机内的 COOKIE 内容。
- HTTP_USER_AGENT 提供包含了版本数或其他专有数据的客户浏览器信息。
- PATH_INFO 这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。
- QUERY_STRING 如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号’?'分隔。
- REMOTE_ADDR 这个环境变量的值是发送请求的客户机的IP地址,例如上面的192.168.1.67。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。
- REMOTE_HOST 这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。
- REQUEST_METHOD 提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。
- SCRIPT_FILENAME CGI脚本的完整路径
- SCRIPT_NAME CGI脚本的的名称
- SERVER_NAME 这是你的 WEB 服务器的主机名、别名或IP地址。
- SERVER_SOFTWARE 这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。例如,上面的值为Apache/2.2.14(Unix)