会话跟踪

9.1   会话跟踪的需求

HTTP是无状态协议:

协议的状态是指下一次传输可以“记住”这次传输信息的能力,无状态是指同一个会话(注意什么叫同一个会话)的连续两个请求互相不了解,当浏览器发送请求给服务器的时候,服务器响应,但是同一个浏览器再发送请求给服务器的时候,他会响应,但是他不知道你就是刚才那个浏览器,每一次请求和响应都是相对独立的。

在客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session 

Cookie是通过客户端保持状态的解决方案。从定义上来说,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息,有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。

与Cookie相对的一个解决方案是Session,它是通过服务器来保持状态的。需要在这里明确一下Session的含义。首先,我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个Session。从这个语义出发,我们会提到Session持续的时间,会提到在Session过程中进行了什么操作等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,我们则会提到往Session中存放什么内容,如何根据键值从Session中获取匹配的内容等。

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

        综上所述,HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。
 

参考http://blog.163.com/xiao_mege/blog/static/72942753201012394736369/           感觉分析的很清楚



9.2  会话跟踪基础


在servlet中, 会话(Session)的使用有以下4个基本步骤:

1) 访问与当前请求相关联的Session对象

调用request.getSession获取HttpSession对象,该对象是一个散列表,存储key和keyvalue的相关信息。

2) 查找与会话相关联的信息

调用HttpSession对象的getAttribute,将返回值转化为恰当的类型并检查结果是否为null

3) 向Session对象中的存储信息

设置需要存储的值以及相应的键

4) 废弃会话数据

调用removeAttribute废弃指定的值,调用invalidate废弃整个会话,调用logout使客户推出web服务器


1,访问与当前请求对象相关联的会话对象

HttpSession session = request.getSession();得到HttpSession对象

原理:在后台,系统从cookie或者福建的url中提取用户ID,这些动作对程序员是透明的,你只需调用getSession,如果在输入的cookie和url中找不到会话ID,系统会创建一个新的空会话。如果使用的是cookie(默认),系统还会创建一个名为JSESSIONID的输出cookie,在其中存储一个唯一的值表示会话ID。(在服务器端读取的时候就是通过这个来识别Session的)

如果不存在会话的时候不想创建新的会话,可以使用HttpSession session = request.getSession(false);,如果不存在session对象就得到一个null值,并不创建空的session对象。


2,访问与会话相关联的信息

HttpSession 对象存在于服务器上,他们并不在网络上传输,它们只是通过某种后台运作机制比如cookie或url重写自动与客户关联起来。Session对象拥有内建的数据结构散列表,存储任意数量的键与键值的对。

session.getAttribute("key")       得到key的属性值,返回类型是Object,需要进行类型转换


3, 将信息与会话关联起来

session.setAttribute("someIdentifier", value);

设置属性和属性值。


4,废弃会话数据

removeAttribute("key")  废弃与指定键关联的值  最常用的

invalidate  删除整个会话(在当前web应用中)

logout  将用户从web服务器中注销,并删除所有属于他的会话




9.3  会话跟踪API

会话的属性是会话中我们最关注的部分,会话还有一些其他的信息,有时候也很重要。来看看HttpSession类的主要方法:(不少方法上面已提到)

public Object getAttribute(String name)
从会话对象中提取之前存储的值,如果没有值与给定的名称相关联,返回null
 
public Enumeration getAttributeNames()
返回所有属性名称的枚举
 
public void setAttribute(String name, Object value)
设置属性和值
 
public void removeAttribute(String name)
移除与指定名称关联的任何值
 
public void invalidate()
讲会话废弃
 
public void logout()
从web服务器注销
 
public String getId()
返回每个会话对应的唯一标识
 
public boolean isNew()
如果会话尚未与客户程序(浏览器)发生任何联系,返回true
 
public long getCreationTime()
返回会话首次构建时间
 
public long getLastAccessedTime()
返回会话最后被客户程序访问时间
 
public int getMaxInactiveInterval()
public void setMaxInactiveInterval(int seconds)
读取或设置在没有访问的情况下,会话应保持多久才被废弃


 
9.4  浏览器会话与服务器会话

一段叙述:
默认的,会话跟踪基于存储在浏览器内存中(而非磁盘上)的cookie,因此,除非servlet显式的读取输入的JSESSIONID cookie并设置最大时效将它发送回去,否则浏览器的关闭将造成会话中断(即若没有设置最大时效,cookie是存储在浏览器内存中的,设置时效才会把cookie存储到磁盘)::客户程序将不能在访问会话,但问题是服务器并不知道浏览器已关闭,因而服务器需要将会话维持在内存中,直到它处于非活动状态设定的时间间隔位置(setMaxInactiveInterval(int seconds)会排上用场)
posted @ 2011-04-16 21:45  jinmengzhe  阅读(2082)  评论(1编辑  收藏  举报