首先了解一下session机制
session机制是一种服务器端的机制,
用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。
当程序需要为某个客户端的请求创建一个session的时候,
服务器首先检查这个客户端的请求里是否已包含了一个session标识。
这个标识称为session id,
如果已包含一个session id则说明以前已经为此客户端创建过session,
服务器就按照session id把这个session检索出来使用,
若没有创建过,则创建一个新的Session。
之前一直以为浏览器一请求服务器上的数据就会建立session,并返回一个JSESSIONID放到浏览器的cookie里,但是在学习过程中发现并不是这样,就做了一系列实验,实验如下:
首先我们对jsp页面发起请求
首次发送请求时会得到一个JSESSIONID,好像并没有什么问题。
接下来看对html文件发起请求
这时响应头并没有JSESSIONID,然后我们用ajax发起一个请求,在servlet中获取session并设置属性。
这是才会建立session,并返回JSESSIONID。
那这就说明Session只有在后台创建了session对象才会建立,并不是请求页面就会建立我们再做一个实验来证明。
请求jsp页面之所以会建立连接,是因为它在编译的时候已经生成了session对象,我们取jsp编译后的java文件中来看一看(E:\eclipseworkspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\ 默认路径一般在workspace的这个目录下 。给大家推荐一个快速搜索文件的软件叫Everything)
这是初始化语句。
其中有一行代码是是session = pageContext.getSession();这里生成了session对象。这是因为在jsp页面的page指令中默认加上了 session="true"这句话,如果不写就为true。
如果改为false会怎么样呢?
这时我们来到改为false的myJSP.jsp页面编译后的java文件。
发现session对象不会被创建了。这时在对此页面发起请求。
发现响应头没有JSESSIONID。由此证明,session是在后台生成session对象时才会创建,并不是一发起请求就创建。
注:如果一旦建立session,再次发起请求就会沿用之前的sessionid,直到关闭浏览器,所以在必要的时候需要重新打开一下浏览器。
以上只是个人学习经验总结,若果有说的不对的地方,请大神指出。