Java session机制与Cookie机制总结

来源:互联网 发布:linux清除内存缓存 编辑:程序博客网 时间:2024/05/16 09:25


Http协议是无状态的,一旦数据交换完毕,用户端与服务器端的连接就会关闭,再次交换数据需要建立新的
连接,这意味着服务器无法从连接上跟踪会话
(1)cookie机制是在客户端保持状态的方案;亦即通过客户端信息确定用户身份
(2)session机制是在服务器端保持状态的方案;亦即通过服务器端信息确定用户身份
【采用服务器端保存状态的方案在客户端也需要保存一个标识:
保存标识的方法:
A.借助于cookie机制保存标识:在交互过程中浏览器可以自动的按照规则把标识发给服务器
B.由于cookie可以被人为进制,必须有其它机制以便在cookie被禁止是仍然将session_id传递回服务器:
URL重写,把session id 直接附加在URL路径的后面:有两种表现形式:
a.作为URL路径的附加信息
http://.../xxx;jessionid=aDJfs15fDJ56DScs1D2sd
b.作为查询字符串附加在URL后面
http://.../xxx?jessionid=aDJfs15fDJ56DScs1D2sd

下面给一个保存session id 标识URL重写的实例:QQ邮箱:
http://ptlogin2.qq.com/qqmail?Fun=clientread&ADUIN=691327442&ADSESSION=iii&ADTAG=jjj&clientuin=691327442&clientkey=CDD7621DAEC25BD81971449A03B3920CE60DD6EB0DE87FACD9F76D90B55BC4DD&ptlang=2052&httptype=1&ADUIN=691327442&ADSESSION=1309579270&ADTAG=CLIENT.QQ.2881_Mysrv.0
-------
如上ADSESSION=1309579270

 

session机制
2.1当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识---称为session id,如果已包含一个session id则说明以前已经为此客户端创建过
session,服务器端按照此session id把session检索出来使用


2.2 session并不是有客户端访问时就被创建,而是服务器端有执行创建语句后再创建,另jsp默认编译是隐
含HttpSession session = HttpServletRequest.getSession(true);


2.3 当需要集群时,保存在session中的对象必须是可序列化的,要求对象可序列化只是为了session能够在
集群中被复制或者能够持久保存或在必要时server能够暂时把session交换出来


2.4 关闭客户端浏览器,session就消失了吗?
这其实涉及到session何时被销毁删除的问题,其实非也,关闭浏览器session并没有消失,如前面2.1所述
程序为客户端创建一个session的时候,会采用session id来标识,并返回客户端,客户端通常采用cookie来
保存这个sesson id 并且整个会话过程浏览器与服务器是通过这个session id 来保持状态交互的;所以关闭
浏览器只是客户端session id的丢失(另人为删除cookie,后得重新登录同理),服务端的session依然在服

务器内存中:其实session销毁有3种情况:
a.程序调用HttpSession.invalidate();
b.session id 已经过了有效期,即超时
c.重启服务器(服务器进程被停止)

伪代码模拟Session机制

                                                                                                                                                                                                                                           

每来一次http请求,tomcat都会判断http header中是否有名字为JSESSIONID的cookie,如果没有则分配一个16字节的随机数,用session.getID()可以获得,最后写入response,同时把该JSESSIONID对应的session对象保存至系统内置的一个session table中,该cookie没有设置过期时间,于是保存在浏览器的内存中并没有写入系统cookie文件,所以直到用户关闭浏览器之前每次请求都会带有这个cookie,而每次重新打开一个新的浏览器窗口都会有不同的JSESSIONID也是这个缘故。这时候当用户下次再来请求便已经有了该JSESSIONID,倘若系统发现session table中没有该值对应的session对象,则意味着session已经过期或者用户调用过session.invalidate()方法。
伪代码如下(注意:这里忽略某些jsp或servlet指定不需要建立session的情况,如<%@ page session="false" %>):

Cookie cookie = request.getCookie("JSESSIONID");
Boolean newSession = false;
If (cookie == null)
{
 // 不带名为JSESSIONID的cookie
 newSession = true;
}
Else
{
 // 已经有JSESSIONID
 Session session = Session_table.gut(session_id);
 If (session == null)
 {
  // session已经过期或者用户调用过session.invalidate()方法
  newSession = true;
 }
}

 

If (newSession)
{
 // 随机生成session id
 String session_id = java.util.UUID.randomUUID().toString();
 // 放入系统内置表,哈希
 session_table.put(session_id, new Session(session_id));
 // 写入用户浏览器
 response.addCookie(new Cookie("JESESSIONID", session_id));
}

 

因为session的设计有连续一段时间没有访问就过期,所以在每次访问<%@ page session="true" %>的页面时都会更新该请求对应session的最终过期时间,而且tomcat默认该值就是true。同时tomcat将会有一个thread定期扫描session table,将那些已到达最后过期时间的session清除,这个就不敲伪代码了

                                                                                                                                                                                                                                            

 

 


cookie机制:
概述:
服务器通过在HTTP的响应头中加上一行特殊的指示提示浏览器按照指示生成相应的cookie,另外纯粹的脚
本如JavaScript或者VBScript也可以生成cookie;
具体内容:
cookie的内容主要包括:名字,值,过期时间,路径和域;路径和域合在一起就构成了cookie的作用范围.如果不

设置过期时间,则表示cookie的生命周期为浏览器会话期,只要关闭浏览器,cookie就消失;如果设置了
过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过过期时间

原创粉丝点击