您的位置:首页 > 其它

session和cookie

2015-12-24 14:26 302 查看
最近好好研究了一下session和cookie对其应用也有了很好的理解,下面记录一下。

1.先说session吧。都说是一种服务器端的技术,session是存储在服务器上的,说白了建立session就是在服务器上新建一个文件来存储一些需要用到的数据,比如我们要在多个页面之间传递变量,就可以利用session先存进去,然后需要的时候再取出来。但要明白一点,一定要在同一个会话当中才能实现变量共享,赋值取值。

2.接下来就重点说一下什么是会话,我简单的理解就是当用户打开浏览器访问WEB服务器,进行一系列操作,直到关闭浏览器为止就可以算的上是一次会话,无论你在打开和关闭浏览器的这段时间里做什么,比如你打开了一个浏览器,开了多个标签访问同一个WEB服务器的一个或者多个网站,都算一次会话,这期间你访问的WEB服务器只会创建一个session文件,返回一个SESSIONID,我们要明白,SESSION的文件名字就是SESSIONID,服务器是通过SESSIONID来判断是否是属于同一个会话的,而这个SESSIONID的来源就是从COOKIE来的,HTTP协议对每次访问WEB服务器都是会带上COOKIE的。弄明白了会话是什么,接下来就容易多了。

3.我们可以用浏览器测试一下,session的工作原理,当你打开一个浏览器的时候,访问一个a.php页面,里面不写任何session相关代码,我们可以通过FIREBUG看cookie里边什么都没有,也就是说这时候没有建立session和服务器端的session文件生成。当你访问一个带session_start();函数的页面的时候,这时候你可以从firebug的控制面板cookie里发现一个名字为PHPSESSIONID的cookie变量,这个就是服务器端建立了一个SESSION文件,并将生成的SESSIONID放在COOKIE中,返回给浏览器保存。当你在同一个会话中,再次开标签访问同一个WEB服务器的时候,发现每次都有一个PHPSESSIONID的cookie返回,而且这个值都没有发生变化。

通过上面的分析我们可以了解session的工作原理:当用户第一次访问WEB服务器时候,只有通过代码层次SESSION_START()服务器端才会随机生成一个SESSIONID,将其以COOKIE的形式存储在HTTP报文中,返回给浏览器存储在本地的COOKIE里(cookie的名字是PHPSESSIONID),于此同时在服务器端创建一个以该SESSIONID为名字的文件,通常会加上前缀sess_XXXXXXX;一般linux服务器中存储在/var/lib/php5/session中。这个文件用来存储代码设置的session值
例如:$_SESSION['NAME']="123"。 当在同一个会话中,第二次访问服务器端文件,HTTP协议会带着COOKIE一起访问后端。服务器端会先根据这个COOKIE带来的SESSIONID判断是否服务器上已经存在了这个文件,如果存在说明是同一个会话,就继续使用已有的SESSION。如果开了另外一个浏览器开了新的会话,COOKIE里没有PHPSESSIONID的值,那么服务器端判断是新开启会话,就会重新创建一个SESSION文件,和返回一个新的SESSIONID给浏览器。 这就弄明白了SESSION。可以说SESSION的使用是以来COOKIE的。还有一点说明,只要在同一个会话里,访问同一个WEB服务器,不管是一个服务器里边的几个网站或者工程。都只会生成一个SESSIONID.这点要跟COOKIE区别开来,COOKIE设置是会区分目录的,例如一个WEB服务器上不同目录里代码设置了COOKIE,那就会在相应的目录里都存在COOKIE,名字相同的也是可以的不会覆盖。会根据网站路径区分。例如localhost/web1里有cookie['name'],localhost/web2里也可以有cookie['name']。这点跟SESSION不同。

cookie就是存储在本地上,可以说就存在浏览器里,每次访问后端服务器,HTTP协议都会让浏览器带上COOKIE访问后端。这样就做到了浏览器和服务器的交互。

4.有时候我们会遇到COOKIE被禁用的时候,这时候就算在一个会话内,打开多个标签访问服务器,每次访问都会得到一个新的SESSIONID。这是因为每次访问服务端,确实生成了SESSIONID,并返回给客户端(利用COOKIE的形式),但是客户端把COOKIE给禁用了。收不到这个SESSIONID,所以下次再请求的时候,COOKIE里边都是空的,那服务器端就判断不存在SESSION就会新建,问题就处在这里。

可以每次当服务端生成SESSIONID的时候,将它保存起来,返回给前端。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: