Java Servlet Specification 3.0 之 第七章之Session 续

来源:互联网 发布:java bos物流项目 编辑:程序博客网 时间:2024/04/30 07:07

7.2 create a sesiion(创建一个会话)

当会话只是一个展望的会话并且还没有建立的时候,其被认为是“新的”。因为HTTP是一个基于协议的请求-响应,一个HTTP会话被认为是新的直到一个客户端添加了进去。当会话跟踪信息返回给服务器时一个客户端加进会话,这个服务器指明建立了会话。直到客户端连接了会话,不能假定来自客户端的下一个请求被认为是一个会话的部分。


这个会话被认为是新的,如果遇到下面的情况:

       客户端还不知道这个会话

       客户端选择不连接一个会话


这些条件定了场景即,servlet容器没有机制将一个请求与其前一个请求关联。


一个servlet开发者必须设计其应用程序来处理客户端没有,不能或者不将连接一个会话的情况。


7.3 Session Scope(会话范围)

HttpSession对象必须在应用程序或者servlet 上下文级别范围内。底层机制,比如cookie用于建立这个Session,针对不同的上下文是一样的,但是引用的对象,包含那个对象的属性,决不能被容器的上下文之间共享。


用一个例子来阐明这个要求:如果一个servlet使用RequestDispacher来调用另一个web应用程序的servlet,创建的会话并且对于将要调用的servlet是可见的,必须与那些可见的调用的servlet不同。


另外,一个上下文的会话必须由这个上下文的请求可以重新获取,不管它们关联的上下文是直接访问或者在创建会话的时候作为请求分发的目标。


7.4  Binding Atrributes into a Session(将属性绑定到一个会话中)


一个servlet可以通过名字绑定一个对象属性到一个HttpSession实现类中。一个绑定到一个会话的对象可以由同样servletContext内的其他servlet访问,并处理请求,这个请求标示为同样会话的部分。


当一些对象置入或者从一个会话中移除时可能会需要通知。这个信息能被由实现了HttpSessionBindLisnter接口的对象获取。这个接口定义了如下方法,要不是通知一个对象正在绑定,或者从一个会话中解绑。

          valueBound

          valueunBound

在对象,借助HttpSession接口的getAttribute方法,变为可用之前,必须调用valueBound方法。在对象,借助httpSession接口的getAttribute方法之后,变为不可用之后,调用valueUnbound方法。


7.5 Session Timeouts(会话超时)


在HTTP协议中,当客户端不在活跃时,是没有明显额终止信号的。这意味着用于指明客户端不再活跃的唯一机制是超时了。


会话的默认超时由servlet容器定义并且能被HttpSession接口的getMaxInactiveInterval方法获取。超时可以由开发者调用HttpSession接口的setMaxInactiveInterval方法改变。

超时时间由秒来定义。根据定义,如果一个会话的超时被定义为-或者更少,会话将从来不会失效。会话失效将从来不会起作用直到使用那个会话的所有servlet从业务方法中退出。一旦会话失效开始了,新的请求不能看见那个会话。


7.6 Last Accessed Times (最后的访问时间)

HttpSession接口的getLastAccessedTime方法允许servlet记录当前请求的的会话最后访问的时间。当作为会话部分的请求由servlet容器初次被处理时被认为访问了会话。


7.7 Important Session Sematics(重要的会话语义)


7.7.1 Threading Issues(线程问题)

               执行请求的多servlets可能在同时主动访问同一个会话对象。容器必须确保内部数据结构(表示会话属性)的调度在一个线程安全模式下执行。开发者保证线程安全访问属性对象。这将保护当前访问的HttpSession对象内部的属性集合,为应用程序排除集合毁坏的情况。

             

7.7.2 Distributed Environments(分布式环境)

              在分布式应用程序中,一个会话中的所有请求必须同时由一个JVM处理。容器必须能够处理HttpSession类的实例中的所有对象,合适地调用setAttribute方法或者putValues方法。下面的约束满足了这些条件:

              1    容器必须接受实现了序列化接口的对象

              2   容器可能选择满足HttpSession其他设计对象的存储,比如EJB组件和事物的引用、

              3    会话迁移必须由容器指定设备处理


              分布式servlet容器必须支持迁移对象,其实现了序列化

              这些约束意味着开发者确保没有其他的并发问题,除了在非分布式环境中遭遇的。

              容器提供者能确保业务功能的可扩展性和质量,比如负载均衡和容灾,通过从分布式系统的一个活跃节点移动一个会话对象,和其内容,到系统的一个不同的节点。


              如果分布式容器持续化或者迁移会话来保证业务功能的质量,就不使用本地JVM序列化机制来序列化HttpSession和它们的属性。开发者不保证容器将调用会话属性的readObject和writeObject方法,如果这些会话属性实现了实现了,但是将保证会话属性的序列化的关闭。


              容器在一个会话迁移期间必须通知实现了HttpSessionActivationListener的会话属性。它们必须在一个会话序列化前通知钝化的监听器或者在一个会话反序列后通知活跃的监听器。


              在开发分布式应用程序时应该注意由于容器可能运行在不止一个JVM上,开发者不能依靠静态变量存储一个应用程序状态。应该使用企业Bean或者一个数据库来存储。


7.7.3 客户端语义


              基于这样的事实,cookie或者SSL认证是由web浏览器处理控制的,与浏览器的独特窗口没有关系。来自一个客户端应用程序的所有窗口发往一个servlet容器的请求可能是同一会话的部分。为了更好地移植,开发者应该总是考虑到一个客户端的窗口在同一个会话中是由多方参与的,而不只是针对某一个客户段窗口的。

             

              


0 0
原创粉丝点击