您的位置:首页 > 编程语言 > PHP开发

phpsession和cookie

2016-08-15 20:59 381 查看
cookie和seesion一般都是放在一起讲,因为二者的关系很紧密,作用大致相同,但也有一定的区别,先介绍下cookie吧。

cookie是一种在客户浏览器端存储数据并以此来跟踪和识别用户的机制。保存的文件为文本文件,不过会加密处理。

当浏览器访问php页面时,服务器会把cookie的数据回送给http响应,当浏览器获取到该信息时,就会在客户端保存cookie的信息。

它一般在网站中有以下作用:

(1).记录访客的信息,比如访问网页的次数,或者记录用户的账号和密码实现自动登录

(2).可以在页面中传递值,这一个页面到另外一个页面,如果需要传变量过去就可以使用cookie传值

如何创建cookie:

bool setcookie(string name,string value,int expire,string path,string domain,int secure,boo httponly)

总共有7个参数:name 是创建的cookie的变量名,value是变量的值,expire是cookie的失效时间,path是cookie在服务器端的有效路径,domain是cookie的有效域名,secure是cookie是否只通过https连接有效,httponly代表是否只支持http传输(安全性问题,列举配置文件时说明)。请注意,cookie只适用于保存小数据。关于cookie的配置文件会放在seesion部分一起列举。
常用的就name,value,expire这三个参数,举个例子

setcookie("test","123","time()+60");

这是设置了一个名为test,值为123,存活时间为60秒的cookie。
读取cookie,按照上面的例子来:
$_COOKIE['test']这样就可以读取到cookie的值了,不过事先最好用isset()函数判断一下是否有名为test的cookie
删除cookie:

如果没有设置cookie的失效时间,那么在关闭浏览器之后cookie便会自动被删除

setcookie("test","",time()-1);将原来设置的cookie的值赋为空,然后时间设为负数就可以达到删除cookie的目的。

cookie的默认存储位置:C:\Users\[user name]\AppData\Roaming\Microsoft\Windows\Cookies
然后是session,专业一点的话来说,session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统所经过的时间,因此,session实际上是一个特定的时间概念。session英文意思是“会话”,打开网站到关闭网站这一整个过程就叫一个session(注:关闭网站是指全部的网页都关闭,退出浏览器)。在网站开发中,session是服务器端技术,利用这个技术,服务器在运行的时候可以为每个用户在服务器端创建一个session文件,便于用户下次访问的时候再调出。比如在电商网站中,你登录你的账号之后,可以看到自己曾经浏览过的商品和购买的商品,有些还能看到上次登录的时间等,这些功能都是由session实现的。

session可以保存的数据类型有:string,integer,double,bool,array,object。

如何启动会话:

session_start();//证明要启用session了


如何注册并使用会话:

$_SESSION['username']=admin;//声明了一个名为username值为admin的变量,数组的用法


删除某一个会话:

unset($_SESSION['username']);//删除名为username的会话
删除多个会话:

$_SESSION=array();//这样就可以删除所有的会话
或者

session_destory;//删除所有会话

以上是session的最基本操作,接下来介绍关于session保存的时间的设置,也就是它的生命周期,说到这,我们不得不先说一下session在客户端和服务器端之间到底发生了什么,我登录电商网站的时候,凭什么服务器就把我的购买记录显示出来了而不是别人的又或者不是新创建一个session。

其实,当客户端申请创建session的时候,服务器端会验证客户端发送的请求中是否包含SESSID,相当于是个唯一标识,如果有,那证明客户端之前已经创建过session,然后就会通过SESSID把属于这个客户端的session读取出来使用,如果不包含,服务器端就会帮客户端创建一个新的session并生成一个SESSID保存在服务器端,然后将SESSID通过http协议返回。

session在服务器端保存的位置在php.ini中通过设置session.save_path可以修改,windows的默认路径在C:/Windows/Temp,linuxd默认在/tmp或/var/lib/php/session

,开头名都是SESS,可以搜索一下,如图:

下划线后面的那一串字符就是SESSID了。

这张图片就是发送请求时通过cookie传递的SESSID的值


通过上面的讲解,我们对session有更深一步的了解了,那么重新回到刚才我们要探讨的session的生命周期的问题,session的生命周期可以通过修改php.ini中的session.gc_maxlifetime来增加或减少,但是它的时间并不是按照单纯的时间长度来计算,举个例子,假如session设置的生命周期是20分钟,不是过了20分钟,刚创建的session就失效了(请注意不是删除,文章下面会具体说明session的垃圾回收机制),而是过了20分钟没人使用,再失效,再极端一点,假如我在session创建了的第19分59秒用了一个这个session,那么这个session不会在下一秒失效,而是重新计时,再来20分钟,20分钟内,又使用了,再重新计时,如此反复,直到过了20分钟没人使用的时候才失效。从上面那张图中我们可以发现很有趣的一个现象,传递SESSID的方式居然是用cookie传送的。那么问题来了,假如用户端把cookie禁用了,那我们的session该怎么办?相当于每发送一次请求就会创建一个新的session。现在一般有有如下几种解决方法:

方法一:

通过GET方法,用表单或者超链接传递session_id,代码如下:

发送页面:

$sessid=session_id();
<form id="form" name="form" method="post" action="index.php?PHPSESSID=$sessid">


接收页面:

<?php
$sessName=session_name();  //获取session的名字,默认是PHPSESSID
$sessId=$_GET[$sessName];  //获取通过表单传递过来的SESSID
session_id($sessId);       //设置session的id为表单传递的SESSID
?>


方法二:

使用SID常量,SID的内容是:PHPSESSID=SESSID,相当于在表单中,action可以直接写为:

action="index.php?'.SID.'"
接收的时候不变

方法三:

设置php.ini中的session.use_trans_sid=1来启用透明SID支持,让php自动跨页面传递session_sid

方法四:

使用数据库存储session_id,手动调用

以上便是一些普遍的解决方法。其实session还有一个用途,那就是防止用户直接输入url跳过登录等操作就可以查看数据等,这个操作是十分危险的,所以我们可以通过用户登录之后,把用户名用session存储起来,然后在其他页面判断是否为空,如果为空,那就证明是非法登录。

下面再介绍一下在php.ini文件中session和cookie的一些配置,比较重要:

session.name = PHPSESSID   //这个即是页面发送请求时的session的名字,默认是PHPSESSID,可以自己更改,更改之后重启apache生效

session.use_trans_sid = 0  //等于1代表启用,默认是0,如果启用的话,页面的url会自带session名=sessionid,对安全有一点影响,不建议开启

session.save_path =         //默认是注释掉了的,前面介绍过默认存储位置,如果想改变位置,修改这个配置即可

//以下三者构成session的垃圾回收机制

session.gc_maxlifetime=1440    //session的默认最大生命周期

session.gc_probabilty=1     //失效的session被删除的可能性

session.gc_divisor=1000    //和session.gc_probabilty一起构成session被删除的几率,这是默认是1/1000,session_start()一使用,就会有千分之一几率删除失效session

session.use_cookies=1     //是否使用cookie

session.cookie_lifetime = 0   //cookie的有效时间,默认是0,即关闭浏览器就失效

session.cookie_path = /   //设置cookie的有效路径

session.cookie_domain =  //设置cookie的有效域名

session.cookie_httponly =     //是否只支持Http传输,1或true代表有效,这个很有用处,可以防止cookie里面的信息被其它方式盗取,在setcookie里面可以设置,或者

ini_set("session.cookie_httponly", 1)

cookie和session的主要区别:

1.cookie存储到客户端,session存储在服务器端

2.安全性相比,cookie的安全性比session要弱

3.cookie通过网络在客户端和服务器端传输,但是seesion不需要传输

4.cookie生命周期的计算方式是累计的,session是根据访问不访问计算,如果在有效时间访问了,则重新计算。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: