首页 > 编程笔记 > PHP笔记 阅读:36

PHP Cookie入门教程

Cookie 是一种存储在客户端的数据,能存储 Cookie 的客户端不只是浏览器,但绝大多数情况下都是由浏览器来实现的。浏览器通过 HTTP 协议和服务端进行 Cookie 交互。

Cookie 是独立于语言而存在的,很多种语言都可以设置和读取 Cookie。在实现过程中,编程语言是通过指令通知浏览器,然后浏览器实现设置 Cookie 的功能。读取 Cookie 则是通过浏览器请求服务端时携带的 HTTP 头部中的 Cookie 信息得来的。

setcookie() 函数

PHP 中可使用 setcookie() 来设置 cookie,语法如下:

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

setcookie 可定义 Cookie 并将其随 HTTP 头部一起发送给客户端,在设置 Cookie 之前不能有任何输出。当 Cookie 被设置后,可在刷新页面后通过 $_COOKIE 全局数组获得。

name 参数是必选参数,表示 Cookie 的名称,Cookie 的值是通过 $_COOKIE[name] 获得的。

value 参数用来设置 Cookie 的值,存储在客户端。

expire 参数用来设置 Cookie 的有效时间,以秒为单位。如果想要删除一个 Cookie,可以将 Cookie 的有效时间设置为当前时间之前,或者使用 unset($_COOKIE[name]) 来删除某个 Cookie。如果不设置这个值,当浏览器关闭时,Cookie 会随之失效。

path 参数用来设置 Cookie 的有效目录,如果设置为/就表示在当前域名下均可用,如果设置为“/foo/”就表示只有在目录“/foo/”和其子目录(如“/foo/bar/”)下才可。

domain 参数用来设置 Cookie 的有效域名,默认在本域名下有效。例如将该值设置为“c.biancheng.net”,那么该域名下的所有子域名如 hello.c.biancheng.net 都可使用该 cookie。如果要设置一个域名的所有子域名都可使用,设置其值为根域名即可,例如 biancheng.net。

secure 参数用来设置是否对 Cookie 进行加密传输,默认为 false。如果设置为 true,那么只有在使用 https 的时候才会设置 Cookie。

httponly 参数如果为 true 就表示只能通过 HTTP 协议才能访问该 Cookie,意味着客户端 JavaScript 不可操作这个 Cookie。使用此参数可减少 XSS 攻击的风险。

使用 PHP 设置 Cookie

下面使用 PHP 分别设置三个 Cookie:
<?php
setcookie('name','PHP教程');
setcookie('num','100',time()+100,'/foo/');
setcookie('gender','male',time()+100,'','http://c.biancheng.net/php/');
print_r($_COOKIE);
?>
第一个 Cookie 设置名为 name、值为“PHP教程”,其他参数都是默认值,表示在当前目录和域名下都有效,且有效时间持续到浏览器关闭。第二个和第三个 Cookie 的设置只在特定的目录域名和有效时间内才能看到。

注意,当第一次在浏览器访问这个脚本文件时并不会有任何输出,因为设置完 Cookie 后需要刷新页面,这样在下次请求时 HTTP 头部才会携带上一次设置的 Cookie 信息,这时才能读取到 Cookie。

第一次在浏览器访问该脚本的请求消息头(Request Headers)和响应消息头(Response Headers)分别如下:

Request Headers:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

可见其并没有携带任何 Cookie 信息,说明浏览器并没有向客户端发送任何 Cookie 信息,而返回的响应消息头中包含了 Cookie 信息。

Response Headers:
Connection:Keep-Alive
Content-Length:10
Content-Type:text/html; charset=UTF-8
Date:Sun, 13 Nov 2016 08:48:14 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.16 (Unix) PHP/7.0.5
Set-Cookie:name=chenxiaolong
Set-Cookie:num=100; expires=Sun, 13-Nov-2016 08:49:54 GMT; Max-Age=100; path=/foo/
Set-Cookie:gender=male; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=-1479026884; domain=www.baidu.com
X-Powered-By:PHP/7.0.5

返回消息头中包含 3 个 Set-Cookie 部分,用于通知浏览器设置对应的 Cookie。当我们再次刷新页面的时候,可看到请求消息头中携带了 Cookie 信息。刷新请求得到的请求消息头如下:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:name=chenxiaolong
Host:localhost
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36 Name

可见其中已经携带了 Cookie 信息,但是只有设置的 name 这一个 Cookie,这是因为其他两个 Cookie 不在这个目录或本域名下有效。

使用 JavaScript 设置 Cookie

前面已经讲过,既然 PHP 和客户端 JavaScript 都可以操作 Cookie,那么用 PHP 设置的 Cookie 也可用 JavaScript 读取到,用 JavaScript 设置的 Cookie 也可由 PHP 读取到。不同的是,PHP 设置的 Cookie 需要在刷新页面后的下一次请求中才有效,而 JavaScript 设置的 Cookie 在本次请求中就有效。

下面用 JavaScript 代码设置 Cookie:
<script type="text/javascript">
function setCookie(name,value){
    var Days = 30;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days*24*60*60*1000);
    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}
function getCookie(name){
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
    if(arr=document.cookie.match(reg))
    return unescape(arr[2]);
    else
    return null;
}
setCookie('test','testhaha');
alert(getCookie('test'));
</script>
浏览器访问本页用 JavaScript 设置的 Cookie 会立即生效。我们再来看访问这个页面的请求消息头和响应消息头:

Request Headers:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:test=testhaha
Host:localhost
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

由于使用的是 JavaScript 在客户端设置的 Cookie,所以在本次向服务端发送 HTTP 请求时就已经携带了 Cookie 信息。我们再用 PHP 代码 echo$_COOKIE['test'];来获得由 JavaScript 设置的 Cookie,此时可在页面成功打印出名为 test 的 Cookie 值。

通过这个例子更清晰地知道,Cookie 是编程语言通过一些指令告知浏览器,由浏览器实现的,浏览器和服务端进行通信时,HTTP 消息头中携带了 Cookie 信息。

Cookie 的应用

Cookie 经常用来存储一些不敏感的信息,如用来防止刷票、记录用户名、限制重复提交等。

这里以防止用户在一分钟之内多次提交为例,代码如下:
<script type="text/javascript">
function SetCookie(name, value) {
    var Days = 30; 
    var exp = new Date(); 
    exp.setTime(exp.getTime() + 60 * 100);  //过期时间为1分钟 
    document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString(); 
} 
function submit() {
    if(getCookie('submit')) {
        alert('you haved submited before,please submit after one minute');
    } else {
        SetCookie('submit','yes');
    }
}
function getCookie(name){
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
    if(arr=document.cookie.match(reg))
    return unescape(arr[2]);
    else
    return null;
}
</script>
<button onclick='submit()'>提交</button>
以上代码实现的是防止用户在一分钟之内多次提交表单,当用户第一次提交表单时,设置 Cookie 有效期为 1 分钟,当再次提交时判断 Cookie 是否过期来限制用户的提交。

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章