码迷,mamicode.com
首页 > 其他好文 > 详细

session与cookie的区别

时间:2015-06-13 16:57:28      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

Session cookie 的区别:
    数据保存位置不同
    生存周期
    安全性
    请求时 携带的数据量不同

1、cookie数据存放在客户的浏览器上,不能看到session,session数据放在服务器上,能看到cookie。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session,所以将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在COOKIE中。
3、session根据浏览器进程存在而存在,而cookie的生存时间可以设置和调整。
4、session必须借助cookie。
5、如果要解决负载均衡中的session同步(共享)的问题,其实有很多解决方案,例如ip_hash、memcached、nginx_sticky_module模块,nginx_sticky_module模块需要浏览器支持cookie的,ip_hash通过线上环境观察,如果是2台Web应用服务器在线的话,短期内客户端请求访问量可能不是太平均,但如果以月为单位会发现,其实2台Web应用服务器的请求数基本是平均的。

开启会话机制:
通常情况下,我们的会话机制 不是默认开启的,需要手动的开启.(可以通过修改php.ini内的配置session.auto_start 达到自动开启的目的),
利用php函数session_start()也可完成。通常没有参数。  
理解session:

注意:
Php所有的变量都是脚本级别的? 脚本结束时,变量都被销毁。
$_SESSION 也是一个变量, 意味着 脚本结束也应该被释放。
为什么 在$_SESSION内保存的数据,可以被传递到下一个请求脚本呢?
这是因为  $_SESSION在被销毁前 将其中数据 保存到某个地方,而在session_start()的时候,又将数据从某个地方获取到,然后放入到$_SESSION数组内。
这样 看上去 $_SESSION可以传递到下个页面,但是其实是经历 保存数据- 销毁->创建->获得数据的过程。
会话数据 可以保存到下一次请求,那么什么时候数据会丢失呢?
数据丢失 是发生在浏览器被关闭时。也就是说 会话数据的有效期 是会话结束(浏览器关闭,就是会话结束)。
会话数据,在会话期间内有效的数据 就是会话数据。会话 指的是 浏览器与服务器之间 产生的一次对话。

服务器 是 如何 识别浏览器的?
我们发现, 浏览器会携带这个标志 来请求服务器,这样 服务器就能 识别出来 是不是 同一个浏览器的请求。(标志相同 即为 同一个浏览器)
以上的  标志ID  称之为 SESSION ID。
服务器 会为不同的sessionID生成不同的数据保存空间(不同的文件)

服务器在浏览器上做了个记号,将某个特殊的数据保存到浏览器上。那么 就意味着
服务器是否可以在浏览器上保存数据?可以
服务器保存到浏览器上的数据,在浏览器发出请求时会不会带到服务器端?能
那么这个操作,服务器在浏览器上 保存数据的操作 是什么技术完成的? 是采用 cookie技术完成的。

Cookie变量的有效期:
默认的cookie变量的有效期是浏览器关闭。
就导致 session的id是保存在cookie内的,一旦关闭浏览器 cookie失效,同时 cookie内的session_id失效,导致 session失效。
但是通常情况下 我们都更改cookie变量的有效期,达到数据长时间保存的目的。
利用 setcookie函数的第三个参数来达到效果:
有效期指的是一个到期时间,使用时间戳来表示。
Setcookie(‘变量名’, ‘变量值’, 有效期);
例如 将cookie变量保存一个小时:  setcookie(‘cookie_p1‘,‘php1025‘,time()+3600);

当浏览器关闭,session失效(cookie内的sessionID没有了),但是服务器上保存session
的数据文件是否还存在?存在 (这个文件就没有用了)
如何删除 保存session数据的服务器端文件呢?
利用这个函数Session_destroy();完成。

注意 :
此方法会删除相关文件,但是 cookie内的 sessionID是不会消失的。
此方法会删除相关文件,但是 脚本周期内的 $_SESSION变量内的数据是不会消失的。
如何删除session相关的所有数据?(如何完全删除一个session?)
$_SESSION  是PHP脚本内使用的session数组
清空:这里,不能unset($_SESSION); 应该清空此变量的内容 $_SESSION= array();
删除:$_COOKIE[‘PHPSESSID’] cookie内的sessionID。
删除一个cookie变量。Setcookie(‘PHPSESSID’, ‘’, time()-1)
删除:Sess_asefasdfasfdasfasfasdfasdf 服务器端保存session数据的文件
Session_destroy();
1.删除 本次回话的数据    $_SESSION = array();  
2.删除cookie里面的   phpsessionid   Setcookie(‘PHPSESSID’, ‘’, time() -1);
3.删除session文件      Session_destroy();   

 问题:

    1  如果浏览器的cookie不能使用,那么session技术能够使用么? 如果在cookie不能用的前提下,非要使用session技术,能不能达到效果,如果能 提出解决方案。
    2   session数据的有效期是什么?(浏览器关闭)为什么? 如果需要在浏览器关闭后 还能继续保存session的值的话,应该做哪些工作?
    3 session与cookie的区别?

如果浏览器端cookie不能用了,那么session还可以使用么?
Session和cookie的联系:session的sessionID是以cookie的形式保存在浏览器端。
如果cookie不能用了,意味着 不能cookie去保存sessionID。
所以,只要想办法 能够让浏览器 携带 sessionID 请求即可.. 只要在请求数据内携带 sessionID即可。
请求数据:也称服务器的外部数据,通常使用GPC表示(get post cookie)。
通常 我们在cookie不能用的情况下 采用 get方式来传递这个sessionID。意味着 在每次请求后 都需要增加一个参数PHPSESSIN=xafafdasfdasnflajsldfalfs
Php内部支持 自动地为 所有的a标签的href属性 增加一个sessionID的参数,需要使用配php .ini置达到效果:
Session.use_trans_sid, 是否在url上传输sessionID,启用他:  session.use_trans_sid = 1
Session.use_only_cookie 是否仅仅使用cookie来保存sessionID。 关闭这个特性:  session.use_only_cookies = 0
当修改了上面的配置后,如果浏览器禁用了 cookie 那么, php会在所有的 a标签内增加 sessionID的传输:

注意 php只会在html内自动增加 PHPSESSID参数,在脚本内不能:
因此 如果类似利用 header(‘Loction:128.php’)这类的代码完成跳转的话,需要手动增加 session参数
此时 可以利用 session_name() 和 session_id()分别获得sessionID的变量名和sessionID的值
header(‘Locaftion:128.php?‘.session_name() .‘=‘.session_id());
还可以在 删除sessionID的cookie变量时 使用这个函数
Setcookie(session_name(), ‘’, time()-1);

如何增加session的有效期?
Session的默认有效期是浏览器关闭。那是因为 保存在cookie内的sessionID丢失了。
因此 如果需要增加session的有效期,也只能在cookie的sesionID上做文章 增加cookie内sessionID的有效期。
1)利用setcookie就可以达到目的:
    setcookie(session_name(),session_id(),time() + 3600);
2)更改配置
    session.cookie_lifetime = 3600
 3)函数
    session_set_cookie_params(3600);
注意 上面的三个做法 是同一个功能,只需要一个即可。
但是 上面的操作只是修改了cookie内的PHPSESSID的有效期, 但是 保存在服务器上的sessionID数据 还有可能失效.需要修改 session.gc_maxlifetime来增加
session数据的有效期。
完成以上两步 才能完全将session的有效期延长。

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

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字符串。

明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如session cookie安全了。

通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。

在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web service了。

session与cookie的区别

标签:

原文地址:http://www.cnblogs.com/gimin/p/4573614.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!