`
t225com
  • 浏览: 661649 次
文章分类
社区版块
存档分类
最新评论

Session的两种实现机制

 
阅读更多

一些基础的东西都快忘光了。。。。。


1、基于Cookie实现Session

Session对象的原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据。在创建Session对象的同时,服务器将会为该Session对象产生一个唯一编号,这个编号称之为SessionID,服务器以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问。需要注意的是,此时的Cookie中仅仅保存了一个SessionID,而相对较多的会话数据保存在服务器端对应的Session对象中,由服务器来统一维护,这样一定程度保证了会话数据安全性,但增加了服务器端的内存开销。
存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享一个Session对象,因为这些请求携带了相同的SessionID信息。
1. Session工作原理
下面的Servlet用来演示Session的工作原理:


该Servlet的url-pattern为/testSession。
当浏览器请求地址“.../tst/testSession?option=create”时,Servlet调用request的getSession方法获得Session对象,如果此时服务器端存在与请求信息中SessionID(作为Cookie信息携带)对应的Session对象,则返回这个Session对象,否则将会创建一个新的Session对象并将其产生的SessionID以Cookie的形式通过响应信息送回。注意,Session对象的setMaxInactiveInterval方法用于设置最长不活动间隔,单位是秒,如果出现在这个的时间段内Session对象没有被存取,则该Session对象将会失效。通常为了保证服务器的性能和出于安全性考虑,这个值要妥善的设置(Tomcat针对Session的MaxInactiveInterval会有默认的设置)。若setMaxInactiveInterval设置为负值,则表示该Session永不过期。另外,Session对象分别通过setAttribute和getAttribute方法存取数据,数据以“名称-对象”对的形式存放。该请求对应的请求和响应的HTTP信息为:
注意:请求信息中携带的SessionID值与上一次相应的SessionID之一致。另外响应输出的HTML文本中有两个“hey”,这是因为这次请求Servlet往存放在Session中的list对象中又放置了一个String对象。

当浏览器请求“.../tst/testSession?option=invalidate”时,Servlet会调用Session对象的invalidate方法用于使该Session对象失效。需要注意的是,此时获取Session对象的方法为重载的getSession(boolean b)其中boolean类型的参数表示当前请求没有和服务器端的某个Session对象关联时是创建新的Session(参数为true时)还是返回null(参数为false时)。

2、基于URL重写

从上面的介绍可以看出,Session对象的正常使用要依赖于Cookie。如果考虑到客户端浏览器可能出于安全的考虑禁用了Cookie,应该使用URL重写的方式使Session在客户端禁用Cookie的情况下继续生效。
下面有两个JSP页面:1.jsp中向Session对象中存入了名为“hi”的一个String类型对象。通过超级链接可以链接到2.jsp,在2.jsp中将获取Session中名为“hi”的对象,并显示在页面上。需要注意的是:在1.jsp中超级链接的地址并不是直接写了“2.jsp”而是通过resopnse的encodeURL方法对这个地址进行了处理。
1.jsp


2.jsp
首先将浏览器的Cookie禁用(注意要重启IE),然后请求1.jsp,响应后点击链接到2.jsp,这个交互过程涉及到两次请求和相应,HTTP信息如下:


注意:由于Cookie的禁用,这次请求协议头中虽然没有携带SessionID的信息,但SessionID的信息作为请求地址的一部分传到了服务器端,这就是URL重写的意义所在。
response的encodeURL方法将根据浏览器是否不支持Cookie决定是否将SessionID信息写入链接地址。

分享到:
评论

相关推荐

    PHP SESSION机制的理解与实例

    PHP SESSION的保存机制有两种方式,session.save_handler = files和session.save_handler = user,具体选用哪种方式保存,可以通过配置php.ini文件实现。 一、使用读写文件的方式保存 SESSION 数据(session.save_...

    Tomcat中实现Session小结

    什么是Session 对Tomcat而言,Session是一块在服务器...实现机制 先看两个问题,如下: 1、服务器如何判断客户端发送过来的请求是属于同一个会话? 答:用Session id区分,Session id相同的即认为是同一个会话,在Tom

    kisso单点登录

    1、session 存放在服务器端,cookie 存放在客户端,存在两种状态:“ 第一种:持久 cookie 具有时效性,以文件的形式存放在客户机硬盘中,时间一到生命周期结束自动被删除。第二种:临时 cookie 又叫会话 cookie 放在...

    通信与网络中的深刻解析iSCSI的2种多路径访问机制

     事实上,若有适当的环境配合,iSCSI也能实现多路径I/O(Multi-Path Input/Output,MPIO,多路径输入输出)与多重连结(Multiple Connections per Session,MC/S)两种多重路径存取的机制,可建立负载平衡、故障...

    用PHP程序实现支持页面后退的两种方法

     //支持页面回跳 第二,使用session_cache_limiter方法 QUOTE: //注意要写在session_start方法之前 session_cache_limiter(‘private, must-revalidate’); 补充: Cache-Control消息头域说明 Cache-Control指定...

    分布式事务实践 解决数据一致性

    介绍了Spring的事务机制、事物抽象、内部事务和外部事物,以及常用的几种事务管理的实现,包括DataSource、JPA、JMS、JTA都通过实例进行说明。还有XA以及两阶段提交,并通过实例演示了使用JTA,通过两阶段提交,实现...

    Seesion在C++服务端的使用方法

    前面介绍了cookie和session两种机制的产生和使用过程(可以关注 CPP后台服务器 公众号查看),但是,似乎在我们C++后台开发过程中遇见的很少; 那session在我们服务端是怎么使用的呢? 首先,我们看一个需求: 客户...

    java面试题

    73.8. transaction有那几种实现(事务处理)(Spring) 79 73.9. Spring IoC 79 73.10. Spring AOP面向方面编程 82 74. 项目中为什么使用SSH 85 75. Spring在SSH中的作用 86 76. weblogic 86 76.1. 如何给weblogic指定...

    千方百计笔试题大全

    237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、...

    java面试宝典

    237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、...

    超级有影响力霸气的Java面试题大全文档

     Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常...

    java 面试题 总结

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    JForum_SSO_-_JForum单点登陆原理与配置

    一般来说,两个不同系统的整合的难点部分,便是需要解决单点登陆问题。...但由于分属于2个不同的系统,所以它们之间不能共用同一套Session,这就需要使用一种特殊的机制来实现它们之间的互相通信。

    分布式协调工具-ZooKeeper实现动态负载均衡

    a、Znode有两种类型: 短暂(ephemeral)(create -e /app1/test1 “test1” 客户端断开连接zk删除ephemeral类型节点)  持久(persistent) (create -s /app1/test2 “test2” 客户端断开连接zk不删除...

    ORACLE锁机制深入理解

    数据库是一个多用户使用... 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被

    JAVA面试题最全集

    如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何获取某个日期是当月的最后一天 如何格式化日期 5.数组和集合 6.文件和目录(I/O)操作 如何...

    PhP框架DoitPHP v1.5 MySql版.zip

    1、对视图文件格式为php和html两种情况的操作进行整合。可使用统一的视图类方法进行视图文件的调用。 2、Controller Class (1)、删除template() (2)、删除getViewFile() 3、Model Class (1)、新增 dump...

    PHP框架DoitPHP v1.5 SAE版.zip

    1、对视图文件格式为php和html两种情况的操作进行整合。可使用统一的视图类方法进行视图文件的调用。 2、Controller Class (1)、删除template() (2)、删除getViewFile() 3、Model Class (1)、新增 dump...

    使用ActiveMQ示例

    发布于2013-4-27企业中各项目中相互协作的时候可能用得到消息通知机制。...ActiveMQJMS定义了两种方式:Quere(点对点);Topic(发布/订阅)。ConnectionFactory是连接工厂,负责创建Connection。Session创建M

    封装android开发中常用的Utils,也许你的项目只需要这一个库就完全够了。

    集成优雅的日志打印风格、app引导页面两行代码实现(也可用作轮播广告图,支持加载本地和网络,一键开启自动翻页功能,内设好几种翻页动画)、高仿iOS进度条和对话框、activity基类的封装(可继承自BaseActivity自行拓展...

Global site tag (gtag.js) - Google Analytics