web 开发中经常碰到session的概念,session 可以在同个浏览进程中不同页面共享数据。
比如用户状态,应用状态数据,最典型的应用就是购物车。今天有朋友问我关于session一些问题,
突然发现自己其实对session这个概念还是很模糊。比如一直以为session是基于tcp连接机制实现的,
但是想到web应用不可能都是长连接实现,那具体如何实现session机制?
查找一些资料并作了一些测试后,应该对session机制了解比较清楚了,特记录如下:
环境为 tomcat + jsp + windows ie
测试页面1:session.jsp
=============================
<%@ page import="java.io.*,java.util.*,java.sql.*,javax.sql.*,javax.naming.*"%>
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page session="true" %>
<%
//取得本次session id
String s= session.getId();
%>
您的session id: <%=s%>
<%
//在session环境中写入 num 值
Integer num = new Integer(100);
session.putValue("num",num);
%>
=======================================
测试页面2:session1.jsp
=============================
<%@ page import="java.io.*,java.util.*,java.sql.*,javax.sql.*,javax.naming.*"%>
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page session="true" %>
<%
//取得本次session id
String s= session.getId();
%>
您的session id: <%=s%>
<%
//取出第一个页面设置的num 值 如果正常取出,则session 功能正常有效
Integer i= (Integer)session.getValue("num");
out.println("Num value in session is "+i.intValue());
%>
===
验证过程:
分别在cookies 允许和禁止的环境下面,先运行 然后再运行
1
2
(这里的jsessionid 值 每次都由第一个页码显示获得)
实验结果:
对于cookies允许和禁止的情况下, 结果不一样,cookies 允许时,session功能正常,cookies 不允许时,session功能不正常,而且第一个页面显示的sessionid,和第二个页面显示不一样。对于cookies允许和禁止的情况下, 的url 形式,结果都正常。
结论总结:
在tomcat这类web服务器中,session的实现机理应该是:客户端http访问时候,在进程范围内,第一次连接会分配一个sessionid,由服务端维护,并且记载到客户端本地cookies(进程范围)。打开新的页面时,会读取本地cookies的sessionid,相同的sessionid的页码视为同个session。这就是为什么本地cookies禁止时,同个ie进程的页面sessionid不同。
如果url有jsessionid 的参数,则是显性的指示该页面的sessionid,所以不管是否有cookies支持,都可以把不同的页面视为同个session,因此session功能正常。这也说明了session的实现机制和底层的tcp连接无关,只是依赖于http的上下文sessionid。所以tomcat有一些sessionid的设置,比如timeout,或者物理化session等。
另外,网上看了一些网友的帖子,有的说tomcat的服务是长连接,有的说应该是短连接,即是每个url请求返回后都断开tcp连接。在上面的验证过程中,我用 netstat -p tcp 来观察端口情况,应该说,一般情况下tomcat对客户端进程的tcp端口连接状态会保持一段时间(几秒钟)如果没有新的url请求,则断开。
一些说明:
1.关于jsp session
jsp 中,可以用session.getId(); 来获得 session id 标志,形式如:3C11883B828E0CC6FF443D87570314EE
2.关于cookies
在window ie -> internat 选项-> 隐私->编辑 中可以设置cookies 的禁止允许。
阅读(1925) | 评论(0) | 转发(0) |