您的位置:首页 > 其它

session会话和cookies

2016-12-26 15:11 351 查看
session会话和cookies出现是原因https协议无状态的,不能标识不同的用户。

session会话是存在服务器端的,存储本次会话的信息。$_SESSION

使用:session_start();
$_SESSION['***]='**';
unset();
session_destory();  //直接删除服务器端的session文件!
setcookie (session_name,session_id(),$lifttime)//可以设置sessionid在cookies中的过期时间,不设置则默认是本次回话。或者通过php.ini设置:session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!

ini_set('session.gc_maxlifetime', 3600); //设置时间
ini_get('session.gc_maxlifetime');//得到ini中设定值
//这是设置gc过期时间,也可以直接在php.ini中设置。


原理:

Session会话在服务器端保存客户信息,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现(首先在客户端保存一个包含session ID的cookie ,在服务器端保存其他session变量,比如session name .当用户请求服务时,会把session ID 一起发送给服务器端,通过session ID 提取保存在服务器端的变量,就能标识对象)。从生存期上讲,Cookie可以长期保存,而Session的生存期仅仅到会话结束。Session会话信息不会一直在服务器端保存,超过一定的时间期限就会被删除,

Session用来追踪每个用户的会话,使用服务器生成的SessionID进行标识,用以区分用户。用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端(当用户发出请求时,如果用户中存在SESSION ID,则服务器将用户Cookie里面记录的SessionID和服务器内存中的SessionID进行比对,从而找到这个用户对应的Session进行操作。)。Session存放在服务器的内存中,SessionID存放在服务器内存和客户机的Cookie里面。

所以,如果客户机禁止Cookie的话,Session也不能使用,但是对于JSP来说(.NET不熟悉),会使用URL重写的技术,在URL里面附加上SessionID,从而实现用户身份的标识。

新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择”在新窗口中打开”时,子窗口便可以访问父窗口的Session。



可以使用cookies或者http1.1协议中的url来实现SESSION_ID的传递。

如果禁用cookies,则:

<?php
if(isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
$sid=session_id();
.....
**
echo "<a href='  ? PHPSESSID=".$sid."'>**</a>";**
或者:
header("Location: **?PHPSESSID=".$sid);
...
?>


有关过期时间注意:

这里有2个设置过期时间:一个是sessionid在客户端cookies中的保存时间,一个是session文件在服务器端的保存时间

对于session文件存在服务器端的时间,当时间超过gc_maxlifetime,可能还会存在session文件,因为php不存在一个单独的daemon线程,查看所有的session是否过期,过期的话采用gc进行回收。而实际中gc的启动时有一定几率的,gc启动后会遍历所有的session文件,判断当前时间减去最后访问的时间,是否大于gc_maxlifetime。


setcookies 这是设置sessionid在cookies中的保存时间,

而session文件在服务器端的保存时间:

session_destory():安全退出,删除保存在服务器端的session文件

直接退出:服务器等待垃圾回收,这是由下面的三个变量决定:



session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!

还有很多的设置,不过和本文相关的就是这些了,下面开始讲如何设置Session的存活周期。

前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以……

如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:

1、把“session.use_cookies”设置为1,使用Cookie来储存SessionID,不过默认就是1,一般不用修改;

2、把“session.cookie_lifetime”改为你需要设置的时间(比如一个小时,就可以设置为3600,以秒为单位);

3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;

session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。

默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。

到此为止,工作一切正常。那为什么会发生gc_maxlifetime无效的情况呢?

在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。在Linux下,这一路径通常为\tmp,在 Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应

用时,它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。

问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。

找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。

还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。

解决这个问题的一个方法是,把se
4000
ssion.gc_probability/session.gc_divisor的机率提高,如果提到100%,就会彻底解决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了 gc_maxlifetime,就清空当前session。

使用:

1 防止非法登录;

2 将随机生成的验证码存在session文件中,把验证码生成的图片传给浏览器端

cookies

存放在客户浏览器端,放在http请求的消息报头中传送给服务器端。

cookies和session区别:

1 存放位置不同

cookies存在客户端,相比不安全

2 过期时间不同:cookies是累积时间,从建立开始计时,到时间过期;session是从最后一次打开session文件到时间。从生存期上讲,Cookie可以长期保存,而Session的生存期仅仅到会话结束。Session会话信息不会一直在服务器端保存,超过一定的时间期限就会被删除,

3 session可以通过cookies实现,

Cookie技术

Cookie机制,它是对HTTP协议的一种补充,以保持服务器和客户端的连续状态。Cookie是由Web服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息(如身份识别号码、密码、用户在Web站点上购物的方式或用户访问该站点的次数)。无论何时用户链接到服务器,Web站点都可以访问Cookie信息。

Cookie的运行过程图

(1)客户端在浏览器的地址栏中键入Web服务器的URL,浏览器发送读取网页的请求。

(2)服务器接收到请求后,产生一个Set-Cookie报头,放在HTTP报文中一起回传客户端,发起一次会话。

(3)客户端收到应答后,若要继续该次会话,则将Set-Cook-ie中的内容取出,形成一个Cookie.txt文件储存在客户端计算机里。

(4)当客户端再次向服务器发出请求时,浏览器先在电脑里寻找对应该网站的Cookie.txt文件。如果找到,则根据此Cookie.txt产生Cookie报头,放在HTTP请求报文中发给服务器。

(5)服务器接收到包含Cookie报头的请求,检索其Cookie中与用户有关的信息,生成一个客户端所请示的页面应答传递给客户端。 浏览器的每一次网页请求,都可以传递已存在的Cookie文件,例如,浏览器的打开或刷新网页操作。

服务器收到Cookie数据,就会在他的数据库中检索你的ID,你的购物记录、个人喜好等信息,并记录下新的内容,增加到数据库和Cookie文件中去。如果没有检测到Cookie或者你的Cookie信息与数据库中的信息不符合,则说明你是第一次浏览该网站,服务器的CGI程序将为你创建新的ID信息,并保存到数据库中。

Cookie是以key—value字符串的形式存在本地中:

发送时以http协议中的消息体:cookie:key=value形式传送。

setCookie(’KEY’,’VALUE’,’TIME’);

删除:

setCookie(’KEY’,’VALUE’,time()-秒);

全部删除可以:

foreach(Cookieaskey=>$value){

setCookie(,,,);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  session cookie