资讯专栏INFORMATION COLUMN

session和cookie实用手记

endiat / 1177人阅读

摘要:那么,怎么才能让服务器识别浏览器身份,认为是同一用户的多次请求,从而达到数据共享呢这就要用到会话技术了,本质上就是数据持久化存储。

由来

    浏览器和服务器间的数据交互,就是会话。
    
    但是呢,http协议是无状态无记忆的,就会导致业务的不连续性。
    [不连续性的说明]譬如你在xxx网站A界面登录成功,当你点击跳转到B界面时,又会提示请登录。
    
    那么,怎么才能让服务器识别浏览器身份,认为是同一用户的多次请求,从而达到数据共享呢?
    
    这就要用到[会话技术]了,本质上就是数据持久化存储。
    
    会话技术,就是来解决http协议缺陷而导致的业务不连续问题。
    相关补充:cookie在浏览器端的存储,是有数据量限制的,一般是4k;
    而前端本地存储技术可弥补,譬如:
    localStorage  (20M)   本地存储    只要用户不手动删除,就一直存在   应用场景:记住皮肤;浏览历史搜索;回到上一次离开的位置等
    sessionStorage (5M) 会话存储    浏览器关闭就没了                应用场景: 单页面应用间数据的传递
    可能存储在浏览器或硬盘上。
    
    会话技术,从保存位置上有所区分:
    持久化存储在服务端,是session
    持久化存储在客户端,是cookie

cookie过程分析

   浏览器请求XXX网站服务器后,服务器把数据存储在浏览器的cookie中;
   后来的每次请求,浏览器都会携带该网站内所有的cookie作为身份,由服务端脚本来识别处理。
   当然,这一过程是基于浏览器执行的。同一网站在不同的浏览器间存储的cookie是不能共享的。

   cookie默认是会话周期,即从浏览器打开,请求服务器资源,到关闭浏览器这一过程。
   cookie因存储在客户端而有安全性的问题,且每次请求都会携带所有的cookie内容。

使用

    /*cookie*/
    //存储的数据类型,一般是字符串

    //格式说明(未展示所有参数,有兴趣的可查手册)
    setcookie("数据名","数据值","有效期","有效路径","有效域名");    
    // 特例:
    // PHP_INT_MAX    永久有效
    // /              默认是当前目录及子目录有效,我这里改成了整站有效
    // .6758591.com   默认是当前域名,我这里改成了跨子域
    setcookie("age",18,PHP_INT_MAX,"/",".6758591.com");
    
    // 增
    setcookie("name","Lin");
    // 删
    setcookie("name","",0);
    setcookie("name","",time()-1);
    // 改
    setcookie("name","Bin");
    // 查
    echo $_COOKIE["name"];

查看(方式很多,择其一)

session过程分析

    浏览器,首次请求xxx网站服务器后,服务端因session_start()而立即创建新的session文件;
    
    文件名默认格式,示例: sess_0l4jphu0c88lm1ka6242po5763    sess_是前缀,后面的字符串是特殊算法生成的具有“唯一随机性”的串儿;
    
    后通过http协议的响应头,setcookie去回传PHPSESSID=0l4jphu0c88lm1ka6242po5763;
    
    浏览器收到响应内容后,将PHPSESSID作为身份信息,保存在cookie,默认是会话周期.
    
    后来的每次请求都会,携带所有的cookie信息(包括身份信息)提交给服务器脚本;
    
    服务端收到请求后,比对查找是否有对应的session文件;
    
    如果有的话,则读取到超全局变量$_SESSION中;
    
    否则会新建session文件,以进行$_SESSION操作.
    
    备注:session文件也不是一直存在于服务端的,默认存活时间是24min。
    默认以文件形式存储,也可存储在DB中.但读取操作还是要消耗服务器资源的。
    由php.ini中可的相关参数决定存活时间、启动gc的几率、session_name命名及存储位置等。

使用

    /*session*/
    //存储的数据类型,几乎支持php的所有数据类型

    //当前页面开启session会话机制.(只要用到的页面,就一定要首先开启.)
    session_start();
    //增/改
    $_SESSION["name"] = "Lin";
    //删
    unset($_SESSION["name"]);     //删除单个session数据
    $_SESSION = [];               //删除全部session数据
    session_destroy();            //连session文件都销毁了
    // 查
    echo $_SESSION["name"];

查看(windows下本地服务器,且未修改php.ini中相关配置参数时)

如果禁用了cookie,那么session如何使用

   cookie和session本质上都能以数据持久化存储的方式解决身份识别问题,那么cookie被禁掉后,本地就没有浏览器身份信息随着请求发到服务器了,服务器自然就不能识别,从而不断的生成新的session文件。这是不可取的。
   解决的关键是,要确保对同一个session文件的操作。那么在sesion_start()前就得指定session_id();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25907.html

相关文章

  • 2017-09-23 前端日报

    摘要:知乎专栏前端给不了解前端的同学讲前端掘金前端够得到安全跨站请求伪造掘金前端面试问题持续更新掘金向核心贡献代码的六个步骤基于的仿音乐移动端个人文章用构建组件网易严选感受开发已完结掘金英文 2017-09-23 前端日报 精选 [译] 网络现状:性能提升指南前端够得到Web安全3--点击劫持/UI-覆盖攻击React, Jest, Flow, Immutable.js将改用MIT开源协议N...

    BingqiChen 评论0 收藏0
  • SAE的Tornado开发经验

    摘要:对,并不是非阻塞的快,而且开发的快,极适合做前后端分离以传递数据的模式。的选择既不简洁又缺乏一致性,但建表重连包装连接池这些总得有人做。缩短重连时间因为超时时间比的通用配置要短,所以的重连时间也必须同步,否则会报的数据库错误。 对程序员来说,新浪云SAE无疑是国内最好的PaaS平台,实名认证和绑定移动端得到的免费云豆,可以让你在做出一款能抬起头的应用之前不愁吃喝。 所以这一年里做过的网...

    stackfing 评论0 收藏0
  • NGINX宏观手记

    摘要:如果请求中有参数,值为,否则为空字符串。获取代理访问服务器的客户端的端口,如果是直接访问该值为空字符串。文件处理结束后,此文件需删除。 showImg(https://segmentfault.com/img/bVbeCcY?w=352&h=72); 前言 任何一个工具都有它的灵魂所在,作为一个PHP程序员,我们可能仅仅使用了它的一小部分,这篇文章让你更加了解Nginx,本章大多都是总...

    AlphaGooo 评论0 收藏0
  • NGINX宏观手记

    摘要:如果请求中有参数,值为,否则为空字符串。获取代理访问服务器的客户端的端口,如果是直接访问该值为空字符串。文件处理结束后,此文件需删除。 showImg(https://segmentfault.com/img/bVbeCcY?w=352&h=72); 前言 任何一个工具都有它的灵魂所在,作为一个PHP程序员,我们可能仅仅使用了它的一小部分,这篇文章让你更加了解Nginx,本章大多都是总...

    GitChat 评论0 收藏0
  • node博客项目开发手记

    摘要:所以呢解决这个问题也很简单,就是对提交的内容进行或者其他形式的编码,在服务器端进行解码,即可解决。项目地址完结撒花 NodeJs开发个人博客项目 预览地址:http://baijiawei.top GitHub地址:https://github.com/bjw1234/blog 需要安装的模块 body-parser 解析post请求 cookies 读写cookie express...

    Jiavan 评论0 收藏0

发表评论

0条评论

endiat

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<