Rumah >pembangunan bahagian belakang >tutorial php >是不是现在的网站都用session了?不用了cookie了?
是吗 cookie没用了吗
是吗 cookie没用了吗
似乎没人说到重点。
简单来说,session在服务器端存储链接链接状态/数据的,cookie是在浏览器端记录链接状态/数据的。
HTTP协议是无状态的,就是说一个浏览器请求网页,接收完网页之后浏览器断开与服务器的链接,服务器不会再记住这个链接的,当浏览器再发送请求的时候服务器总是把这个请求当作新的请求,服务器不知道这个浏览器以前发送过什么东西。比如用户登录这个问题,当浏览器发送用户名密码登录成功之后,会断开与服务器的链接,那么再发送请求的时候就服务器其实是不知道这个浏览器登录过了。
所以为了解决这个问题,服务器就在 HTTP 头里加入了一个cookie,浏览器收到之后就会存储起来。浏览器每次发送请求的时候都会把这个cookie顺带发送给服务器,那么服务器就可以通过浏览器发送过来的 cookie 知道这个浏览器以前发送过什么请求(如果服务器记录过得话)。说到登录就是,浏览器发送 POST 请求登录之后,服务器返回一个登录成功,并且包含了随机生成的唯一cookie,那么浏览器以后的请求都会发送这个cookie,服务器读取这个cookie,那么服务器就知道以前这个用户登录过了。当然cookie也可以用来在浏览器端存储数据,在浏览器端js是可以读取cookie的,所以可以存储一些数据,等用户下次访问网页的时候就可以读取,比如,某些网页的游戏的你曾经获得的最高分,甚至是用户名和密码(不过HTML5支持其他的方式,存到cookie里的越来越少了),发送到服务器端,服务器不理会就是了。
刚才说道登录的时候,用户登录之后服务器会分配一个唯一的 cookie,那么服务器当然也需要存储这个cookie,另外为了记录这个浏览器以前做过什么,那么也必须记录在这个cookie下发送过的一些请求,比如用户登录之前的页面是某个页面下,登录后需要给人家跳转回去呀(就是一些用户曾经发送的请求,但有没有必要写入到数据库里的临时数据)。PHP,Java等通过这个唯一的cookie(不一定是cookie,下面解释)访问这些数据"接口"叫做session。基本上就是声明某些页面使用session,然后你在这些session里面存储数据,PHP等会自动帮你生成唯一的cookie和存储这个cookie对应的数据,而这些数据是不发送给浏览器端的。你不需要知道这个唯一的cookie是什么和对应的数据存储在哪里,PHP等服务器自动帮你处理这这些操作。所以说,其实session就相当于PHP等帮你实现了一个数据库,存储这个cookie及其对应的数据,只不过这些数据都是临时的,不需要像数据库那样的永久保存。(如果你想把这些数据存储在cookie里也是可以的,不过如果存储的数据太多的话也是浪费带宽什么的,而这样的实现的话每次多发送的数据只是这个唯一的cookie,另外每次都发送这些数据的话毕竟也不太安全。cookie可以在浏览器端伪造,所以所有重要数据都要加密存储在cookie里,但是如果使用唯一的密钥又怕破解,使用不同的密钥又不方便管理,而且加解密都要浪费计算资源,所以这些数据还是存储在服务器端吧)
刚才说的是,服务器考cookie实现session,其实还有 URL重写的方式实现 session。浏览器每次发送请求,其实还有一个地方可以存储数据,那就是URL,所以上面说道的唯一标识可以到网页中的url中。在网页中的URL的末尾添加这个唯一标识,浏览器发送请求的时候依旧会把这个唯一标识发送过去。比如把http://www.example.com/path/to/file.php
变成http://www.example.com/path/to/file.php;PHPSESSIONID=唯一标识
。但是这种方式有一个确定,那就是需要在服务器端代码的每一个网页的每一处链接手动的完成这个URL的转换,显然没有使用cookie的方式方便。
session也是靠cookie实现的
cookie可以长期保存一些数据
session则是短期维持会话数据
两者不冲突
大多数session都是用cookie实现的
两者各有用处,不能代替。
一般来说,session只存在于会话期,一旦结束会话就不存在了。就算不结束会话,一般也会在一定时间后被清除,所以只能用来缓存一些不需要持久化的数据。
cookie除了可以存在于会话期,还可以相对长时间的保存数据。比如你要保持登录,就要用cookie。session的session id也是用cookie保存的,不过这是php自己进行的不需要你干预。
cookie存在客户端。客户端可以读取cookie保存内容。
每次发起请求,客户端找出页面的cookie传给服务器。
cookie内容改变一般有两种:
每次请求时,服务器返回内容,设定cookie。
客户端的js脚本之类也可以改变cookie
基于cookie,用于保存session的id。
session存取都在服务器。客服端不知道session保存内容,但知道sessionID。
每次发起请求,sessionID随着cookie传给服务器。
session内容只能由服务器读取和改变。
保存期限都是有对应设置的,不存在什么这个保存时间长、那个短。(但是有个安全性问题参见下文)
cookie由保存者(服务器或者客户端)指定,每个cookie内容有单独的有效期设定;
session在服务器有设定,有效期是对于整个session来说的。
cookie是可以伪造的,而session保存在服务器无法篡改。session保存内容更安全。
当然你看了上面可能会说:sessionID保存在cookie里,cookie可以伪造,所以可以伪造sessionID啊。
一般来说,伪造一个有效的sessionID还是有难度的。引出的另一个问题伪造session与题干无关不再赘述。
只需要服务端用到、客户端不需要 的数据,推荐用session。不想让客户端知道的敏感数据尤其适用。
需要客户端临时使用,不需要服务器保存 的 数据,推荐用cookie。比如页面统计里跟踪用户行为的临时数据
有些情况下用session或者纯cookie都可以,此时就要结合特点去衡量采用什么。
一般现在采用session比较多,现在网站也不缺那点空间资源
cookie:节省服务器资源,可以长期有效,不安全,适合存不重要的信息。
session:占用服务器资源,一般用户操作期间才有效,安全,适合存重要信息。
session是server端保存会话数据的,一般会画结束就会销毁,所以生命周期很短暂,不可以长期保存数据。
cookie是保存在client端的,可长期保存数据。
session 也需要 cookies 技术的支持
不建议直接在 cookies 中存东西,首选 session
session需要用到cookie的呢
cookie肯定会用,例如网站登录后,生成一个key,key除了放缓存外,还会把相关的值保存到cookie,当要验证用户是否登录的时候,直接拿对应cookie的值,再在缓存比较
“网站登录状态保存7天”,这个就要靠COOKIE解决,如果用session,由于seesion是保存在服务端,服务器会有被塞暴内容的风险