HTTP Cookie

来源:互联网 发布:vue.js和react.js 编辑:程序博客网 时间:2024/05/19 03:42
我们在一些留言本、BBS讨论区发贴时常会出现这种现象:当进入发贴界面时 在要求填写用户名和密码的地方就已经自动地填上了你的资料。这是什么会事呢?这是因为程序中引入了COOKIE技术的缘故。原来在你第一次登录时,程序就 已在你的电脑中安装了一个COOKIE信息包,在你今后登陆时电脑就自动检索你的COOKIE并取出信息包的信息供程序调用,所以出现上面所述的现象。

COOKIE只不过是CGI程序要求浏览器持有的一个信息包,这个信息包可以由CGI程序在任何时候收回。每当CGI程序要求创建COOKIE 时,COOKIE可以从服务器传送到浏览器所属的子目录下(通常是保存在C:\WINDOWS\Temporary Internet Files的目录下,这个过程称为COOKIE的安装。
    COOKIE的安装和读出通常都由一个CGI模块来完成,下面我就将此模块的原代码公布给大家,有了这个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="gzdzw.51.net"
secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。

cookie的接收是通过设置环境变量HTTP_COOKIE来实现的,CGI程序可以通过检索该变量获取cookie信息。

----------------------------------------------------------------------------------------------------------------------------------------

Cookie相关的Http头

    有 两个Http头部和Cookie有关:Set-Cookie和Cookie。
    Set-Cookie由服务器发送,它包含在响应请求的头部中。它用于在客户端创建一个Cookie
    Cookie头由客户端发送,包含在HTTP请求的头部中。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。

Set-Cookie Header 
    Set-Cookie响应头的格式如下所示:

        Set-Cookie: <name>=<value>[; <name>=<value>]...
                    [; expires=<date>][; domain=<domain_name>]
                    [; path=<some_path>][; secure][; httponly]

    expires=<date>: 设置cookie的有效期,如果cookie超过date所表示的日期时,cookie将失效。
                    如果没有设置这个选项,那么cookie将在浏览器关闭时失效。
                    注意:date是格林威治时间(GMT),使用如下格式表示:
                        DAY, DD MMM YYYY HH:MM:SS GMT

                        DAY
                            The day of the week (Sun, Mon, Tue, Wed, Thu, Fri, Sat).
                        DD
                            The day in the month (such as 01 for the first day of the month).
                        MMM
                            The three-letter abbreviation for the month (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec).
                        YYYY
                            The year.
                        HH
                            The hour value in military time (22 would be 10:00 P.M., for example).
                        MM
                            The minute value.
                        SS
                            The second value.

    domain=<domain_name> : 
    path=<some_path>:
                    注:临时cookie(没有expires参数的cookie)不能带有domain选项。
                    当客户端发送一个http请求时,会将有效的cookie一起发送给服务器。
                    如果一个cookie的domain和path参数和URL匹配,那么这个cookie就是有效的。

                    一个URL中包含有domain和path,可以参考http://www.w3school.com.cn/html/html_url.asp
 


    secure   : 表示cookie只能被发送到http服务器。
    httponly : 表示cookie不能被客户端脚本获取到。

 

 在程序中生成expires 

    C的方式 
        time_t curTime = time(NULL);
        tm * gmTime = gmtime(&curTime);

        char strExperis[50];
        strftime(strTimeBuf, 100, " %a, %d %b %Y %X GMT;", gmTime);

    JavaScript的方式 
        var d = new Date();
        var expires = d.toGMTString();

 

Windows中的InternetSetCookie 

在Windows中我们可以使用InternetSetCookie来设置Cookie,假如说,A和B两个进程使用Cookie通信,那么会有如下几种情况:

 > A写Global Cookie,B写Session Cookie,此时,A中无法获取Cookie

 > A写Session Cookie,B写Session Cookie,此时,A与B中的Cookie互不影响

 > A写Session Cookie,B写Global Cookie,此时A中的Cookie被Global Cookie覆盖,它们共享一份Global Cookie

    注:这种情况的后果下,如果有任意一个进程再写Session Cookie,那么其他进程将获取不到Cookie