当前位置: 首页 > 后端技术 > PHP

session和cookie的实战笔记

时间:2023-03-29 14:41:38 PHP

浏览器与服务端进行数据交互的源头就是session。但是http协议是无状态、无记忆的,会导致业务不连续。【不连续的解释】比如你在xxx网站的A界面登录成功,点击跳转到B界面时,会提示你重新登录。那么,服务器如何识别浏览器的身份,并认为是同一用户的多次请求,从而实现数据共享呢?这就需要使用【会话技术】,本质上是持久化数据存储。Conversation技术就是为了解决http协议缺陷导致的业务不连续问题。相关补充:cookies在浏览器端的存储受数据量限制,一般为4k;而前端本地存储技术可以弥补,例如:localStorage(20M)只要用户不手动删除本地存储,总会有应用场景:记住保存皮肤;浏览历史搜索;返回到最后左边的位置等。sessionStorage(5M)session存储在浏览器关闭时就没有了。应用场景:单页应用之间的数据传输可能存储在浏览器中,也可能存储在硬盘上。Session技术从存储位置来区分:持久化存储在服务器端,session是持久化存储在客户端,cookiecookie进程分析浏览器对XXX网站服务器的请求,服务器将数据存储在浏览器的cookie中;对于后续的每一次请求,浏览器都会携带网站中的所有cookies作为身份,由服务器端脚本进行识别和处理。当然,这个过程是基于浏览器进行的。同一网站在不同浏览器之间存储的cookies不能共享。默认cookie是一个session周期,即从打开浏览器,请求服务器资源,到关闭浏览器的过程。Cookie存在安全问题,因为它保存在客户端,每次请求都会携带所有Cookie内容。使用/*cookie*///存储的数据类型,一般为字符串//格式描述(没有显示所有参数,有兴趣可以查看手册)setcookie('数据名','数据值','有效期','有效路径','有效域名');//特殊情况://PHP_INT_MAX永久有效///默认是当前目录和子目录有效,我改成整个站点有效//.6758591.com默认是当前域名,我改成跨子域setcookie('age',18,PHP_INT_MAX,'/','.6758591.com');//添加setcookie('name','Lin');//删除setcookie('name','',0);setcookie('名字','',时间()-1);//更改为setcookie('name','Bin');//检查echo$_COOKIE['name'];查看(多种方式,任选其一)session过程分析浏览器,第一次请求到xxx网站服务器后,由于session_start(),服务器会立即新建一个session文件;文件名的默认格式,例如:sess_0l4jphu0c88lm1ka6242po5763sess_为前缀,后面的字符串是由特殊算法生成的具有“唯一随机性”的字符串;在http协议的响应头之后,setcookie返回PHPSESSID=0l4jphu0c88lm1ka6242po5763;浏览器收到响应内容后,以PHPSESSID作为身份信息,保存在cookie中,默认为session周期。后续每次请求都会携带所有的cookie信息(包括身份信息)提交给服务器脚本;服务器收到请求后,比较是否有对应的session文件;如果有的话,会读入超全局变量$_SESSION;否则,将为$_SESSION操作创建一个新的会话文件。备注:session文件并不总是存在于服务器上,默认直播时间为24分钟。默认以文件的形式存储,也可以存储在DB中。但是,读取操作仍然会消耗服务器资源。php.ini中的相关参数决定了存活时间、启动gc的概率、session_name的命名和存储位置等。使用/*session*///存储的数据类型支持php的几乎所有数据类型//当前页面开启session会话机制。(只要使用到页面,就必须先打开)session_start();//增加/改变$_SESSION['name']='Lin';//删除unset($_SESSION['name']);//删除单个session数据$_SESSION=[];//删除所有会话数据session_destroy();//连session文件都销毁了//检查echo$_SESSION['name'];检查(windows下本地服务器时,php.ini中的相关配置参数没有修改)如果禁用cookies,session如何使用cookies和session本质上可以通过持久化数据的方式解决身份识别问题贮存。cookie被禁止后,本地就没有浏览器身份信息随请求发送给服务器,服务器自然无法识别,从而不断产生新的。会话文件。这是不可取的。解决的关键是保证对同一个session文件的操作。然后你必须在session_start()之前指定session_id();