java服务器何时创建Session

java服务器何时创建Session

转载jliang981 发布于2016-05-20 10:57:15 阅读数 11747  收藏

展开

Session 机制:

session机制是一种服务器端的机制,
用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。
当程序需要为某个客户端的请求创建一个session的时候,
服务器首先检查这个客户端的请求里是否已包含了一个session标识。

这个标识称为session id,
如果已包含一个session id则说明以前已经为此客户端创建过session,
服务器就按照session id把这个session检索出来使用,
若没有创建过,则创建一个新的Session。

那么这个session是什么时候创建的呢?
之前一直错误地理解为:
当用户向服务器发起请求时,这个session便会立刻建立起来,
但实际上却根本不是这样。

在Servlet中,你肯定用过下面这句话,

HttpSession session = request.getSession();

如果当前没有session,则会立刻建立一个session;
如果有session则返回当前session。

这句话和

HttpSession session = request.getSession(true);

的效果是一样的。

但是如果你写成

HttpSession session = request.getSession(false);

则不会自动建立session。
若当前没有session,你所得到的seesion只会是一个null。

我们先来测试访问一个jsp页面
在servlet中我们写上

 
  1. HttpSession session = request.getSession(false);

  2. System.out.println(session==null);

这句话不会建立session,如果当前没有seesion建立的话,控制台输出应该是true的。

然后我们去访问页面。
第一次访问:输出false(servlet先于jsp被执行)
通过查看请求信息我们得到如下内容

    响应头信息         原始头信息
Content-Length     824
Content-Type       text/html;charset=ISO-8859-1
Date	           Thu, 05 Apr 2012 14:46:16 GMT
Server	           Apache-Coyote/1.1
Set-Cookie         JSESSIONID=7397F04B2A96275E1FDD177DA62A2400; Path=/Test01/; HttpOnly

你肯定会有点好奇,明明没有在servlet做任何创建session的操作,然而实际上cookies里面已经有了一个JSESSIONID了。

第二次访问:输出true,
这表示session的确已经被建立了,所以会有JSESSIONID。

这是怎么回事呢?

原因:
默认的情况下,用户第一次访问jsp页面就会创建session,
因为jsp中指令session默认配置为true,

<%@ page session="true"%>

下面我简单解释下jsp的运行过程,
jsp运行时,先会转换成一个java文件然后再编译成class文件,最后输出结果。
既然这样,我们就可以先查看下jsp生成的java文件
打开
%TOMCAT_HOME%\work\Catalina\localhost\
然后打开所使用项目名称的文件夹,比如我的是:
Test01\org\apache\jsp
这个jsp文件夹下面就是你对应的jsp生成的java文件代码了,
这个目录结构和你的WebRoot的jsp目录结构是一样的。
打开/test/test_jsp.java

里面有一句

session = pageContext.getSession();

因此当这个jsp页面执行时,这句话就会帮你创建session了。

OK,那我们现在试试<%@ page session="false"%>,然后再去访问这个jsp页面。
当然你需要先关闭浏览器再打开,否则原来的session还在那里呢。

    响应头信息           原始头信息
Content-Length	     824
Content-Type         text/html;charset=ISO-8859-1
Date                 Thu, 05 Apr 2012 14:47:38 GMT
Server               Apache-Coyote/1.1

好了,这时我们发现那个JSESSIONID已经消失了,控制台输出的session==null结果也是true了。

总结:
session不是一打开网站就会立刻建立。
它的建立需要基于下面两个条件中的任意一个:

1:在servlet中手动调用

HttpSession session = request.getSession();

或者

HttpSession session = request.getSession(true);

2:jsp中没有写<%@ page session="false"%>
(默认情况下它是<%@ page session="true"%>的)

如果两个条件同时都不满足,那么你建立的只是一个无seesion的连接。

转载网址:http://www.360doc.com/content/12/0511/12/1542811_210284774.shtml

  • 点赞 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值