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仍然有效直到超过过期时间
- Java session机制与Cookie机制总结
- session机制与cookie机制
- session机制与cookie机制
- Cookie 与 session 机制
- cookie与session机制
- session与cookie机制
- cookie与session机制
- Cookie与Session机制
- Cookie与Session机制
- Cookie与Session机制详解
- 详解cookie与session机制
- Cookie的机制与Session机制
- cookie机制与session机制的区别
- cookie机制与session机制的区别
- 理解cookie和session机制 【总结+转载】
- cookie与session的机制与原理
- Cookie与Session机制,什么时候用Cookie,什么时候用Session
- cookie和session机制区别与联系
- android还没入门
- 保存数据的一系列方法
- MFC的应用
- 博客转移到独立站点
- tomorrow is another day
- Java session机制与Cookie机制总结
- 无线网络视频监控系统基本概念和术语
- 网络编程--服务器编程模型
- ListView内控件与listview抢夺焦点
- CreateDIBSection、BITMAPINFO、BITMAPINFOHEADER、RGBQUAD - [Daliy APIs]
- 异常详细信息: System.Data.SqlClient.SqlException:用户 'IIS APPPOOL\DefaultAppPool' 登录失败解决办法
- js面向对象,多种创建对象方法!
- 计算几何专项:UVa 11437
- LaTeX 中经常会碰到绘制表格.