Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226170
  • 博文数量: 31
  • 博客积分: 1427
  • 博客等级: 上尉
  • 技术积分: 409
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-04 15:21
文章分类

全部博文(31)

文章存档

2008年(31)

我的朋友

分类: 系统运维

2008-06-26 17:18:09

    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) |
给主人留下些什么吧!~~