为什么有session?

首先大家知道,http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。

那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术。

原理很简单,假设你访问网页时就像逛澡堂,第一次进去你是没有钥匙的,这个时候你交了钱服务台就分配一把钥匙给你,你走到哪里都要带上,因为这是你身份的唯一标识,接下来你用这把钥匙可以去打开一个专有的储物柜存储你的衣物,游完泳,你再用钥匙去打开柜子拿出衣物,最后离开游泳池时,把钥匙归还,你的这次游泳的过程就是一次session,或者叫做会话,在这个例子中,钥匙就是session的key,而储物柜可以理解为存储用户会话信息的介质。

那么在web server中如何实现session呢?想必看了上面的例子你会很容易理解,主要是解决两个问题,一个是钥匙的问题,一个是存储用户信息的问题。对于第一个问题,即什么东西可以让你每次请求都会自动带到服务器呢?如果你比较了解http协议,那么答案一目了然,就是cookie,如果你想为用户建立一次会话,可以在用户授权成功时给他一个cookie,叫做会话id,它当然是唯一的,比如php就会为建立会话的用户默认set一个名为phpsessid,值看起来为一个随机字符串的cookie,如果下次发现用户带了这个cookie,服务器就知道,哎呀,刚刚这位顾客来了。

剩下的是解决第二个问题,即如何存储用户的信息,服务器知道会话id为abc的用户来了,那abc想存储自己的私人信息,比如购物车信息,如何处理?这个时候可以用内存、也可以用文件,也可以用数据库了,但有个要求是,数据需要用用户的会话id即可取到,比如php就默认会把会话id为abc的用户会话数据存储到/tmp/phpsess_abc的文件里面,每次读取都要反序列化程序可以理解的数据,写的时候又需要序列化为持久的数据格式。

如何实现session的共享?

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。

事实上,各种web框架早已考虑到这个问题,比如asp.net,是支持通过配置文件修改session的存储介质为sql server的,所有机器的会话数据都从同一个数据库读,就不会存在不一致的问题;php支持把会话数据存储到某台memcache服务器,你也可以手工把session文件存放的目录改为nfs网络文件系统,从而实现文件的跨机器共享。

还有一个简单的办法可以用于会话信息不会频繁变更的情况,在机器a设置用户会话的时候,把会话数据post到机器b的一个cgi,机器b的cgi把会话数据存下来,这样机器a和b都会有同一份session数据的拷贝。

二 。

sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。

session在访问tomcat服务器HttpServletRequest的getSession(true)的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;

存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。

那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。

创建:sessionid第一次产生是在直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建。

删除:超时;程序调用HttpSession.invalidate();程序关闭;

session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理(memcache,redis)。

session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象

session会因为浏览器的关闭而删除吗?
不会,session只会通过上面提到的方式去关闭。
下面是tomcat中session的创建:
ManagerBase是所有session管理工具类的基类,它是一个抽象类,所有具体实现session管理功能的类都要继承这个类,该类有一个受保护的方法,该方法就是创建sessionId值的方法:
(tomcat的session的id值生成的机制是一个随机数加时间加上jvm的id值,jvm的id值会根据服务器的硬件信息计算得来,因此不同jvm的id值都是唯一的),
StandardManager类是tomcat容器里默认的session管理实现类,
它会将session的信息存储到web容器所在服务器的内存里。
PersistentManagerBase也是继承ManagerBase类,它是所有持久化存储session信息的基类,PersistentManager继承了PersistentManagerBase,但是这个类只是多了一个静态变量和一个getName方法,目前看来意义不大,对于持久化存储session,tomcat还提供了StoreBase的抽象类,它是所有持久化存储session的基类,另外tomcat还给出了文件存储FileStore和数据存储JDBCStore两个实现。

留下来慢慢感悟(关于session和cookie)相关推荐

  1. 白话 Session 与 Cookie:从经营杂货店开始

    在Web开发里面有一个历久不衰的议题,那就是Session与Cookie的区别.从我刚开始学程序时这一题就常出现在面试考题里,一直到现在都还是能看见这个问题. 这个问题重要吗? 我觉得满重要的.因为S ...

  2. 拜托!不要再问我Session与Cookie的区别了

    点击上方"民工哥技术之路"选择"星标" 每天10点为你分享不一样的干货 从我刚开始学程序时这一题就常出现在面试考题里,一直到现在都还是能看见这个问题. 这个问题 ...

  3. C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie

    由于种种原因,我们有时需要从互联网上抓取一些资料,有些页面可以直接打开,而有些页面必登录之后才能打开.本文介绍的是使用 HttpWebRequest 和 HttpWebResponse 自动填写提交 ...

  4. 单点登录与权限管理本质:session和cookie介绍

    本篇开始写「单点登录与权限管理」系列的第一部分:单点登录与权限管理本质,这部分主要介绍相关的知识概念.抽象的处理过程.常见的实现框架.通过这部分的介绍,能够对单点登录与权限管理有整体上的了解,对其相关 ...

  5. session 与 cookie的区别

    session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键.基于网上一些文章和资料的参阅,及作者个人的应用体会,对这 ...

  6. html点击按钮删除session,Asp.net中安全退出时清空Session或Cookie的实例代码

    概览: 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问.这种所谓的退出并不是安全的. 那么怎样做到安全退出呢? 那就是点击 ...

  7. PHP中session和cookie的区别

    这个话题无论是系统运维还是PHP开发人员面试时会经常遇到,所以这里也进行一些总结和归纳,session和cookie的具体理论网上比较大,大家googel下均可:系统运维注意区分下session(会话 ...

  8. session和cookie的区别和联系---转载

    区别 1.存放位置: session保存在服务器,cookie保存在客户端 2.存放的形式: session是以对象的形式保存在服务器,cookie以字符串的形式保存在客户端 3.用途: sessio ...

  9. Session与Cookie区别[1][摘]

    Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间.而Se ...

最新文章

  1. 联想打字必须按FN+数字-fn打字
  2. php abstract
  3. VTK:图片之ImageCheckerboard
  4. js中null,undefined,false,0,'',[],{}判断方法
  5. Java 8 Map新增方法
  6. 速修复!开源企业自动化软件 Apache OFBiz 出现严重的 RCE 漏洞
  7. 决策树算法的应用python实现_决策树ID3和C4.5算法Python实现源码
  8. 马哥2019python全套视频-马哥Python60集全套视频网盘链接免费分享
  9. Android包体积优化
  10. 【jvm】《尚硅谷宋红康JVM全套教程(详解java虚拟机)》上篇 笔记
  11. Sentinel Slot扩展实践-流控熔断预警实现
  12. CSP认证-201809-1-卖菜
  13. 求学信计算机专业英语,求学信模板英文
  14. C++(qt)游戏实战项目:坦克大战(五)
  15. 2020 中秋、国庆快乐!
  16. matlab 稀疏随机矩阵,Matlab 稀疏矩阵函数
  17. 朴素贝叶斯详解及中文舆情分析(附代码实践)
  18. 深扒程序员外包,为啥我不建议你去外包公司?
  19. 网络安全基本属性和STRIDE
  20. 如何做好基层管理者(一)

热门文章

  1. There is no getter for property named ‘username‘ in ‘class com.kuang.entity.User‘“
  2. 突发奇想nico爬虫
  3. 翻译考试用计算机作答,2021翻译资格水平考试:CATTI考试时间是多久?考试是上机操作吗?...
  4. 华裔计算机科学家图灵奖,首位获得图灵奖的华裔科学家-姚期智
  5. HDMI 2.1特性
  6. 【SICP练习】118 练习3.45【待完成】
  7. 黑马c++学习笔记提高篇1
  8. 炼铁技术有哪些?普锐特冶金技术告诉你!
  9. 从零开始一起学slam--icp
  10. 微软进入RPA市场,这意味着什么?