sessionid如何产生?由谁产生?保存在哪里?

标签: sessionid 在哪里 | 发表时间:2017-04-03 10:25 | 作者:lixuguang
出处:http://www.iteye.com

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两个实现。

浏览器禁用cookie后,怎么使用session,解决方案:

sessionid是存储在cookie中的,解决方案如下:

Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session

session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于 SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。 经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:

<form name=”"testform”" action=”"/xxx”"> <input type=”"hidden”" name=”"jsessionid”" value=”"ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764″”> <input type=”"text”"> </form>

URL重写:

http://www.test.com/test;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

 

目前,为了使web能适应大规模的访问,需要实现应用的集群部署. 而实现集群部署首先要解决session的统一,即需要实现session的共享机制。

 

 目前,在集群系统下实现session统一的有如下几种方案:

 

  • (1) 应用服务器间的session复制共享(如tomcat session共享)
  • (2) 基于cache DB缓存的session共享
  •  

应用服务器间的session复制共享

    

       session复制共享,主要是指集群环境下,多台应用服务器之间同步session,使session保持一致,对外透明。 如果其中一台服务器发生故障,根据负载均衡的原理,web服务器(apache/nginx)会遍历寻找可用节点,分发请求,由于session已同步, 故能保证用户的session信息不会丢失。

 

 

此方案的不足之处:

 

  • 技术复杂,必须在同一种中间件之间完成(如:tomcat-tomcat之间).
  • session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时, 性能下降更加显著. 这种特性使得web应用的水平扩展受到了限制。
  • Session内容序列化(serialize),会消耗系统性能。
  • Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。  

 

  基于cache DB缓存的session共享

 

       即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,web服务器(apache/nginx)会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存 时,则去cache DB中查找,如果找到则复制到本机,这样实现session共享和高可用。

 

目前有开源的msm用于解决tomcat之间的session共享:Memcached_Session_Manager(MSM)

 

http://code.google.com/p/memcached-session-manager/


一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。

 

特性

  • 支持Tomcat6、Tomcat7支持黏性、非黏性Session
  • 无单一故障点
  • 可处理tomcat故障转移
  • 可处理memcached故障转移
  • 插件式session序列化
  • 允许异步保存session,以提升响应速度
  • 只有当session有修改时,才会将session写回memcached
  • JMX管理&监控
  •  

该方案的不足之处:

  • memcache支持的数据结构比较单一
  • memcache的内存必须足够大,否则会出现用户session从Cache中被清除
  • 需要定期的刷新缓存
  • 服务器故障时,存在于内存的memcache数据将会丢失

 为了解决基于memcache中存在的不足,故提出了下面的一种解决方案:

 

基于redis缓存的session共享

 

 

结合上面的 MSM 思想,由 redis负责 session 数据的存储,而我们自己实现的 session manager 将负责 session 生命周期的管理。

 

 

 

       此架构存在着当redis master故障时, 虽然可以有一到多个备用slave,但是redis不会主动的进行master切换,这时session服务中断。

 

      为了做到redis的高可用,引入了zookper或者haproxy或者keepalived来解决redis master slave的切换问题。即:

 

 

      此体系结构中, redis master出现故障时, 通过haproxy设置redis slave为临时master, redis master重新恢复后,

 再切换回去. 此方案中, redis-master 与redis-slave 是双向同步的, 解决目前redis单点问题. 这样保证了session信息

在redis中的高可用。

 

实现此方案:

nginx        1   192.168.1.102

tomcat1    1  

tomcat2    1

redis-master   1 

redis-slave      1

slave1     1

slave2     1

 

haproxy vip  1



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [sessionid 在哪里] 推荐:

sessionid如何产生?由谁产生?保存在哪里?

- - 互联网 - ITeye博客
sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应. tomcat生成的sessionid叫做jsessionid. session在访问tomcat 服务器HttpServletRequest的getSession(true)的时候 创建,tomcat的ManagerBase类提供创建sessionid的方法: 随机数+时间+jvmid;.

sessionId安全性

- - 互联网 - ITeye博客
session id 安全性问题. 最一般的方法是自己管理session id. 用户login后,在后台加密出一个accessToken,并返回给用户. 客户端接收到accessToken,可以将它存起来,web的话可以存在session storage,手机也可以保存accessToken,用于单点登录.

shiro 一个项目多个系统sessionid赋值 (getsession 重载)

- - ITeye博客
Shiro Security是非常不错的Security框架. 最近在我的项目中进行相关整合,shiro不难,难就难在如何对已经成熟的系统进行整合. 作为相关切入点,我也考虑了很久,整体运用上了如张开涛大佬所说. 对于Subject我们一般这么使用:. 1、身份验证(login). 2、授权(hasRole*/isPermitted*或checkRole*/checkPermission*).

我的星座在哪里?

- Dex - 科学松鼠会
有没有想过在天上找到自己的星座. 这篇短短的指南就是为身在大城市苦于“光海污染”的你准备的. 本文将以上海为例,教你如何辨别黄道十二星座,同时也适用于我国东部各大城市(西部地区只要换用地方时也同样可以使用). 即使在城市,头顶上也有许多风景等着你去欣赏. 首先,因为我们是在讨论天文学而非占星,有几个星座的名字先要统一:以下,我将只使用这些星座在天文学上的正式名称.

我的瓶颈在哪里?

- 弛 - 博客园-首页原创精华区
   最近在处理一些比较复杂的问题,在解决这个问题的同时,我深刻的体会到,问题的本身,对我来讲,并不是最重要或者最紧要的(当我解决掉一个问题,其结果也只是问题不存在了). 我认为是我的思维能力或者思维方式,用最优质的方法去解决问题,这才是王道. 在平平淡淡的生活中,我们会碰到大量的问题,有的问题 凭直觉就能解决,如果碰到稍微复杂的问题,我们就不知道从什么地方入手,也就是我们找不到解决问题的方法,或者叫切入点.

轻博客:Zapd 比 Tumblr 好在哪里?

- Jarod - 爱范儿 · Beats of Bits
确切地说,Zapd 作为一个新兴的轻博客挑战者,拿它跟 Tumblr 相比真是太抬举 Zapd 了. Tumblr 在 2007 年上线,现在已经累计了 1817 万个博客页面,每天新增内容 2552 万条. 而 Zapd 上线不足两个月,在 App Store 上的总下载量不过 25 万(截止四月底),凭什么在轻博客领域分一杯羹.

新问题: iPhone5 将在哪里发布?

- SotongDJ - 爱范儿 · Beats of Bits
虽然现在包括  CNet , Engadget 在内的很多媒体都认为苹果下一次的发布会将会在 10 月 4 号举行,而且星期二也是苹果一贯喜欢召开媒体发布会的日子. 但是,苹果新首席执行官 Tim Cook 走上演讲台之前,这些都是流言. 何况,也没有任何媒体能够提供可靠的消息来源: AllthingsD 提到他们的消息来自某个“ sources close to the situation ”——即可能是是苹果即将发布产品会场的工作人员.

平板市场 — Android 差在哪里?

- tossking - 爱范儿 · Beats of Bits
年初 Honeycomb 刚刚发布的时候,我们对于这个平板市场的新生力量充满了好感. 现在,Honeycomb 设备大量上市已经有半年时间了,系统版本也静悄悄升级到了 3.2,市场反应仍然平平. 我手里这台平板是十寸的 Acer Iconia a500,主要配置与其他 Honeycomb 平板并没有太大区别:双核 tegra2 1GHz,1 GB ram,双摄像头,各种接口齐全,比较有特色的地方是有一个全尺寸的 USB 接口,而且直接支持 USB Host,这使得连接外接设备容易很多.

TBBT.S05E04:上帝粒子在哪里?

- Jacky - 果壳网 guokr.com - 果壳网
作者:Steed 在《生活大爆炸》第 5 季第 4 集里,Sheldon 养成了一个新的习惯:所有跟生活琐事相关的决定,他都改用掷骰子的方法来决定. 虽然骰子 “掷” 出的决定经常让 Sheldon 很无语,但至少成效还是让他满意的:在坚持了几个星期之后,他不仅在重量级期刊上合作发表了两篇论文,还夸口说: “I'm close to figuring out why the Large Hadron Collider has yet to isolate the Higgs boson particle”.

生物技术的Facebook在哪里?

- - 生物技术创新创业
这几天华尔街报上,或者其它有关金融的广播,报刊都大幅报道Facebook将要上市的故事,市值可能一千亿美金. 有人说它不值那么多钱,按照这个估价,Facebook需要在今后十年每年增长30%. 先不去管它是否值,我更关心的是 象这样的公司为什么在生物技术行业不常见. 喊得很响的罗氏收购Illumina的案例也不过六七十亿,为什么有这么大的差异.