通过
HttpSession案例一和
HttpSession案例二的学习,大家对HttpSession的用途有了一定的了解。今天我们来深入了解HttpSession的原理。学习HttpSession的原理对大家运用HttpSession有很大帮助。
1.HttpSession原理分析
首先,我们知道session对象是由服务器创建,并保存在服务器端。那么服务器在什么情况下创建session对象?浏览器在访问服务器时,服务器又是通过什么来找到对应的session对象呢?带着这些问题,我们来深入了解HttpSession。
1.1服务器如何识别session对象
session是依赖于Cookie的。浏览器访问服务器后,在浏览器端查看cookie时可以发现一个名为JSESSIONID的cookie。如图1-1所示:
图1-1 cookie信息
从图1-1可以看出,这个名字为JSESSIONID的cookie的值是A147B274C704729BA01624490C898757,并且过期时间为浏览会话结束时,即表示当浏览器关闭,该cookie就死亡。其实这个cookie的值就是当前会话session的id值。
服务器每次创建的session对象,都具有一个id属性,也是唯一标识的属性。服务器创建session后,将它的id值保存在cookie中,然后发送给浏览器。浏览器在一次会话中无论访问服务器的那个资源都会带着这个cookie,服务器会根据cookie的值找到对应的session,然后从session中取出数据。下面通过一张图形象理解这个过程们,如图1-2所示:
图1-2 浏览器与服务器之间传递session过程
调用request.getSession()方法是从名为JSESSIONID的cookie中获取session的id值,然后拿到这个id值去服务器的session缓存中查找对应session并返回。
1.2服务器在什么情况下创建session对象
调用request.getSession()方法可以获得session对象,但并不是代表调用该方法服务器就会创建一个HttpSession对象,只有在一次会话中,第一次调用该方法时服务器才会创建一个session对象。
request.getSession()方法会查找请求信息中是否存在一个名为JSESSIONID的cookie,这个cookie是否存在会导致出现以下三种情况:
Cookie不存在,说明服务器还没有为本次会话创建session对象,这时服务器会创建一个session对象,并把这个session对象保存在session缓存中,然后将session的id值保存在一个cookie中,再把这个cookie发送给浏览器。
- Cookie存在,session的id值有对应的session对象:
拿到该cookie的值,即session的id值,然后根据id值去session缓存中查找到了对应的session对象,这时服务器不会重新创建session,而是将找到的session返回。
- Cookie存在,session的id值没有对应的session对象:
根据session的id值在session缓存中没有找到对应的session对象,这时服务器创建新的session,并将新session的id值保存在一个cookie中,然后响应给浏览器。
以上就是服务器创建session的对象的三种情况。另外,request对象还有其他两个方法可以获取session对象,分别是:
- request.getSession(false):这个方法的作用是:从cookie中取出session的id值,但是该id值没有对应的session,服务器不再创建新的session对象,返回null;
- request.getSession(true):该方法的作用和request.getSession()方法的作用一样。
HttpSession对象有最大不活动时间,默认的最大不活动时间是30分钟,也就是说,如果session对象长时间不被使用,30分钟后这个session对象就会失效。
2.验证HttpSession对象创建时机
(1)创建一个web应用,Example23,在该应用下新建一个Servlet类,SessionServlet,该Servlet类的访问路径为:“/SessionServlet“,主要代码如例1-1所示:
例1-1 SessionServlet.java
public class SessionServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("请查看是否有jsessionid这个cookie");
}
}
例1-1中,因为要向浏览器端响应中文,因此要设置响应信息编码以防乱码。
(2)将Example23发布到Tomcat服务器中,然后启动服务器,在浏览器地址栏上输入:http://localhost:8080/Example23/SessionServlet,浏览器显示结果如图1-3所示:
图1-3 浏览器显示结果
(3)查看浏览器中保存的cookie信息,如图1-4所示:
图1-4 cookie信息
由图1-4可知,该浏览器中并没有一个叫JSESSIONID的cookie,也就是说浏览器访问服务器端的SessionServlet,服务器并没有创建session对象。因为在SessionServlet中并没有调用request.getSession()方法。
(4)现在在浏览器端访问Example23应用的index.jsp页面,然后查看浏览器中的cookie信息,如图1-5所示:
图1-5 cookie信息
由图1-5可知,访问index.jsp页面后,浏览器中存在一个名为JSESSIONID的cookie,说明服务器创建了一个session对象。我们并没有在index.jsp页面调用request.getSession()方法,服务器为什么就创建session对象了?因为session是jsp页面的内置对象,服务器将jsp翻译成Java文件后,在该Java文件中存在一句代码,调用了getSession()方法。
(5)将浏览器中的cookie删除,然后修改SessionServlet,如下所示:
public class SessionServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.getSession();
response.getWriter().write("请查看是否有jsessionid这个cookie");
}
}
(6)重新启动服务器,在浏览器端访问SessionServlet ,然后查看浏览器的cookie信息,如图1-6所示:
图1-6 cookie信息
当在SessionServlet中添加request.getSession()代码,服务器就创建了session对象。
本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee