带你了解session和cookie作用原理区别和用法


Posted in Javascript onAugust 14, 2017

Cookie概念

      在浏览某些 网站时,这些网站会把一些数据存在客户端,用于使用网站等跟踪用户,实现用户自定义功能.

是否设置过期时间:

      如果不设置 过期时间,则表示这个 Cookie生命周期为 浏览器会话期间 , 只要关闭浏览器,cookie就消失了.
      这个生命期为浏览会话期的cookie,就是会话Cookie;

存储:   
      一般保存在内存,不在硬盘;
      如果设置了过期时间, 浏览器会把cookie保存在硬盘上,关闭再打开浏览器, 这些cookie依然有效直到超过的设置过期时间;
      存储在硬盘上的Cookie可以在不同的浏览器进程间共享,比如两个IE窗口。
      而对于保存 在内存的Cookie,不同的浏览器有不同的处理方式。

原理:

     如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,
     比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。
     服务器会解释为 cookie变量。
     所以只要不关闭浏览器,那么 cookie变量便一直是有效的,所以能够保证长时间不掉线。
     如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以使用 cookie被攻击的可能性比较大。
     如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。
     如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的 cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。
     所以 cookie是可以伪造的。
     当然,伪造的时候需要主意,直接copy cookie文件到 cookie目录,浏览器是不认的,
     他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器,
     曾经在学校的vbb论坛上面做过试验,copy别人的 cookie登录,冒用了别人的名义发帖子,完全没有问题。
 
cookie 用法:

setcookie("user","zy",time()+3600); 设置user为zy,一小时之后失效;
  $_COOKIE['user'];     取回user值(名字)
  setcookie("user","",time()-3600); 删除cookie,第二个参数为空,第三个时间设置为小于系统的当前时间即可.

  或在浏览器设置

      在使用Cookie时,Cookie自动生成一个文本文件存储在IE浏览器的Cookie临时文件夹中,应用浏览器删除Cookie文件的具体操作步骤为
      >选择IE浏览器中的工具/internet选项命令,打开Internet选项对话框,
      >在常规选项卡中单击删除Cookie按钮,在弹出的对话框中单击确定按钮,即可成功删除全部Cookie文件.
 
Session的概念

      Session 是存放在服务器端的类似于HashTable结构(每一种web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户数据;

作用:

      实现网页之间数据传递,是一个存储在服务器端的对象集合。

原理:

      当用户请求一个Asp.net页面时,系统将自动创建一个Session;退出应用程序或关闭服务器时,该Session撤销。系统在创建Session时将为其分配一个长长的字符串标识,以实现对Session进行管理与跟踪。
      session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
      
保存:

      存储在Server段的内存进程中的,而这个进程相当不稳定,经常会重启,这样重启的话,就会造成Session失效,用户就必须要重新登录,用户体验相当差,比如用户在填写资料,快要结束的时候Session失效,直接跳到登录页面;

是否已经创建过session:

      当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),

      如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来....使用(检索不到,会新建一个),
 
      如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,

      session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

     (总结: 创建一个session时,服务器看这个客户端 是否包含session标识, 是的话按照session id把session检索出来,否则就得 新建一个.)

 Session的客户端实现形式(即Session ID的保存方法):

     一般浏览器提供了两种方式来保存,还有一种是程序员使用html隐藏域的方式自定义实现:

     [1] 使用Cookie来保存,这是最常见的方法,本文“记住我的登录状态”功能的实现正式基于这种方式的。

     服务器通过设置Cookie的方式将Session ID发送到浏览器。
 
     如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。

     如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同 样会发送到服务器上。


     [2] 使用URL附加信息的方式,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置Cookie过期时间是一样的。(URL重写,就是把session id直接附加在URL路径的后面。)


     [3] 第三种方式是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。
     表单隐藏字段就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
      <form name="testform" action="/xxx">
         <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
         <input type="text">
       </form>
      实际上这种技术可以简单的用对action应用URL重写来代替。

session 用法:
        用户信息保存到session前,先启动;
         session_start();                     启动session
         $_SESSION['user']="zy";      设置用户名
         unset($_SESSION['user']);    销毁用户名
         session_destory();                失去已经存储的session的数据

cookie 和session 的区别:

       1、cookie数据存放在客户的浏览器上,session数据放在服务器上.

       简单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,
       客户端每次请求服务器的时候会发送 当前会话的session_id,服务器根据当前session_id判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。
       由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的session_id,用特殊的浏览器伪造该用户的请求也是能够成功的。
       session_id是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性,我曾经就遇到过一次。
       登录某个网站,开始显示的 是自己的信息,等一段时间超时了,一刷新,居然显示了别人的信息。

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

       2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。

       3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。

       4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

注意:

      session很容易失效,用户体验很差;

      虽然cookie不安全,但是可以加密 ;

      cookie也分为永久 和暂时 存在的;

      浏览器 有禁止cookie功能 ,但一般用户都不会设置;

     一定要设置失效时间,要不然浏览器关闭就消失了;

 例如:

      记住密码功能就是使用永久cookie写在客户端电脑,下次登录时,自动将cookie信息附加发送给服务端。

      application是全局性信息,是所有用户共享的信息,如可以记录有多少用户现在登录过本网站,并把该信息展示个所有用户。

两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了)
一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)

以上就是小编为大家整理的session和cookie作用原理,区别和用法的全部内容啦,希望对大家的学习有所帮助~

Javascript 相关文章推荐
CCPry JS类库 代码
Oct 30 Javascript
jquery ajax 检测用户注册时用户名是否存在
Nov 03 Javascript
如何让页面加载完成后执行js
Jun 26 Javascript
12种不宜使用的Javascript语法整理
Nov 04 Javascript
js几秒以后倒计时跳转示例
Dec 26 Javascript
js兼容火狐获取图片宽和高的方法
May 21 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
Sep 20 Javascript
原生js封装二级城市下拉列表的实现代码
Jun 16 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
Aug 23 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 Javascript
react.js使用webpack搭配环境的入门教程
Aug 14 #Javascript
JS原生数据双向绑定实现代码
Aug 14 #Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 #jQuery
关于在mongoose中填充外键的方法详解
Aug 14 #Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 #Javascript
jQuery:unbind方法的使用详解
Aug 14 #jQuery
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 #Javascript
You might like
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
用php将任何格式视频转为flv的代码
2009/09/03 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
JS之相等操作符详解
2016/09/13 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
将python图片转为二进制文本的实例
2019/01/24 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
护理专业本科生自荐信
2013/10/01 职场文书
计算机求职信
2013/12/01 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers