HTTP是无状态的协议,所以每次到web的请求都是单独的连接。为了在一定时间内保存
客户的浏览记录,经常采用Cookie和Session在一段时间内来保存客户的交互数据。Cookie
比较简单。服务器在响应请求时将需要数据,以“键-值”对的形式通过响应信息保存在客户端,
当浏览器再次访问相同的应用时,客户端会将原先的Cookie通过请求信息带到服务器端,从而
保持用户的会话状态,但Cookie信息保存在客户端,存在较大的安全隐患,并且大部分浏览器
对Cookie的数目及数据大小有严格的限制(一般是4K)。为了解决Cookie的问题,可以采用
session方法。以下主要整理session方面的知识。
1.session的原理
session存放于服务器,web服务为客户端创建并、维护一个Session对象,用于存放数据。
用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个“会话”。会话
开始时WEB服务创建Session对象,同时服务器会为该Session产生一个唯一编号,这个编号称
之为SessionID,服务器以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,
浏览器将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到Session对
象,并对其需要访问的资源进行响应。当用户关闭浏览器时客户端保存SessionID的Cookie将会被清
除。需要注意的是,Cookie中仅仅保存了一个SessionID,具体的信息由web服务来维护,所以服务
器端的内存开销也会随之增大。
2.session存放的信息
Tomcat默认的方式是使用StandardManager来管理Session。Tomcat 默认会有session.ser的文
件,存放在“Tomcat主目录workCatalina localhost应用名”路径下。tomcat启动后会读取这个文件,
载入其中的Session信息,然后把它删掉。
也可以更改Tomcat默认的Session管理方式。在“Tomcat主目录confCatalina”下建立应用对于
的Context定义,如建立名为test.xml的XML文件,文件的内容如下:
maxInactiveInterval=”60″ pathname=””/>
通过Context元素的子元素Manager配置Session的管理对象:
className属性用于指定管理Session的类可以是StandarManager或PersitentManager。
maxActiveSessions表示允许最多活动Session对象的数目,-1表示不限制。
maxInactiveInterval表示Session默认的最长不活动间隔,单位为秒。
pathname表示StandarManager在服务器重启或应用重新加载时持久化Session对象的文件名,此处设置
为“”相当于关掉了Session的持久化机制。
3.session的处理过程
在Java Web Server(即Servlet/JSP Server)中,Session ID用jsessionid表示(请参见Servlet规范)。
3.1 session请求
HTTP Request一般由3部分组成:
(1)Request Line
这一行由HTTP Method(如GET或POST)、URL、和HTTP版本号组成。
例如,GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
(2)Request Headers
这部分定义了一些重要的头部信息,如,浏览器的种类,语言,类型。Request Headers中还可以包括
Cookie的定义。
例如:
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.4)
Accept-Language: en-us
Cookie: jsessionid=1001
(3)Message Body
如果HTTP Method是GET,那么Message Body为空。 如果HTTP Method是POST,说明这个HTTP Request
是submit一个HTML Form的结果, 那么Message Body为HTML Form里面定义的Input属性。例如,
user=guest
password=guest
jsessionid=aaaa
注意,如果把HTML Form元素的Method属性改为GET。那么,Message Body为空,所有的Input属性都
会加在URL的后面。你在浏览器的URL地址栏中会看到这些属性,类似于
http://www.xxxx.com/login.do?user=guest&password=aaaa&jsessionid=1111111
从理论上来说,这3个部分(Request URL,Cookie Header, Message Body)都可以用来存放Session ID。
由于Message Body方法必须需要一个包含Session ID的HTML Form,所以这种方法不通用。
3.2 URL重写
Session对象的正常使用要依赖于Cookie。如果考虑到客户端浏览器可能出于安全的考虑禁用了Cookie,应该
使用URL重写的方式使Session在客户端禁用Cookie的情况下继续生效。
首先刷新一个页面,给这个页面定义一个名字,然后写入session并链接到下一级页面,在下一级页面访问的时候
通过response的encodeURL进行处理。也就是说下一级页面是获得上一级页面的session。
4.Session对象的持久化
session一般都存放在内存中,当服务器内存问题,或者服务器宕机时session就会丢失。有两种方法,一、将
session进行集群化,tomcat支持此功能。二、将session写入文件数据库共享内存中,方便在服务恢复是重新加载。
这就是session的持久化。 在java中session数据的序列化接口(java.io.Serializable)实现。
tomcat在进行同步的时候除了sessionid还于服务名和域名相关,所以对于大型网络即时将session保存到
memcached或者内存数据库、NFS等也会取到不同的session。
如果tomcat前有负载工具也会造成获取失误,建议在负载设备上制定session的链接规则。
整理参考:
http://tech.it168.com/jd/2007-09-29/200709291005796_1.shtml
http://www.edutt.com/book-show-3B3B3B393F423A3C363B3E3D413A366B787874.html
http://virgos.javaeye.com/blog/221271