


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
对 Web 服务器进行集群,Session 的安全和同步是最大的问题,实现 Session 同步有很多种 方案,常见的可能的方式有: 1、客户端 Cookie 加密。 用的较少,此处不详述。 2、 Session 复制。 参与集群的每个节点的 Session 状态都被复制到集群中的其他所有节点上,无论何时, 只要 Session 发生改变,Session 数据都要重新被复制。Tomcat 、JBoss、was 都提供了这样 的功能,其中 Tomcat 采用集群节点广播复制,JBoss 采用配对复制机制。 优点: 每个节点都复制一份 Session,一个节点出现问题时其它节点可以接替它的工作。 缺点:节点间进行 Session 同步会占据不少系统资源,整体性能随着集群节点数的增加而急 剧下降。 3、 Session 共享。 将所有节点的 Session 放到一起进行统一管理,每个节点在未参与集群以前都有自己独立 的 Session 体系,参与到集群以后可以让所有节点将各自的 Session 信息用一套相同的机制 保存到一个统一的地方进行存取,这样不管请求被分发到哪个节点都可以访问到其它节点 创建的 Session。 一、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 被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从 开启到结束的过程。session 其实就是网站分析的访问(visits)度量,表示一个访问的过 程。 session 的常见实现形式是会话 cookie(session cookie),即未设置过期时间的 cookie, 这个 cookie 的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。 实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含 sessionid,如果 未包含,则系统会创造一个名为 JSESSIONID 的输出 cookie 返回给浏览器(只放入内存, 并不存在硬盘中),并将其以 HashTable 的形式写到服务器的内存里面;当已经包含 sessionid 是,服务端会检查找到与该 session 相匹配的信息,如果存在则直接使用该 sessionid,若不存在则重新生成新的 session。这里需要注意的是 session 始终是有服务 端创建的,并非浏览器自己生成的。 但是浏览器的 cookie 被禁止后 session 就需要用 get 方法的 URL 重写的机制或使用 POST 方法提交隐藏表单的形式来实现。 二、如何实现 session 的共享? 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存 在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不 同的机器呢?这个时候会话 id 在客户端是没有问题的,但是如果用户的两次请求到了两台 不同的机器,而它的 session 数据可能存在其中一台机器,这个时候就会出现取不到 session 数据的情况,于是 session 的共享就成了一个问题。 1.各种 web 框架早已考虑到这个问题,比如 asp.NET,是支持通过配置文件修改 session 的存储介质为 sql server 的,所有机器的会话数据都从同一个数据库读,就不会存在不一 致的问题; 2.以 cookie 加密的方式保存在客户端 .优点是减轻服务器端的压力,缺点是受到 cookie 的 大小限制,可能占用一定带宽,因为每次请求会在头部附带一定大小的 cookie 信息, 另外 这种方式在用户禁止使用 cookie 的情况下无效. 3.服务器间同步。定时同步各个服务器的 session 信息,此方法可能有一定延时,用户体 验也不是很好。 4.php 支持把会话数据存储到某台 memcache 服务器,你也可以手工把 session 文件存放 的目录改为 nfs 网络文件系
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环保采砂船租赁合同范本
- 汽修厂入伙协议合同模板
- 深圳商住楼购买合同范本
- 预制桥梁承包协议书模板
- 自动售药机合作协议合同
- 物业公司合同工合同范本
- 联通终止合同协议书范本
- 珠宝买卖服务合同协议书
- 黄冈还建房卖房合同范本
- 销售网络合作协议书范本
- 输水管道施工监理实施细则
- 搅拌器设计计算
- 关于个人现实表现材料德能勤绩廉【六篇】
- 【吊车租赁合同范本】吊车租赁合同
- 电梯井道脚手架施工方案
- 《游戏力养育》读书笔记PPT模板思维导图下载
- 琦君散文-专业文档
- 企业会计准则、应用指南及附录2023年8月
- 初中数学浙教版九年级上册第4章 相似三角形4.3 相似三角形 全国公开课一等奖
- DLT 5066-2010 水电站水力机械辅助设备系统设计技术规定
- 测绘生产困难类别细则及工日定额
评论
0/150
提交评论