JAVA培训之HttpSession原理

通过HttpSession案例一HttpSession案例二的学习,大家对HttpSession的用途有了一定的了解。今天我们来深入了解HttpSession的原理。学习HttpSession的原理对大家运用HttpSession有很大帮助。

1.HttpSession原理分析

首先,我们知道session对象是由服务器创建,并保存在服务器端。那么服务器在什么情况下创建session对象?浏览器在访问服务器时,服务器又是通过什么来找到对应的session对象呢?带着这些问题,我们来深入了解HttpSession。

1.1服务器如何识别session对象

session是依赖于Cookie的。浏览器访问服务器后,在浏览器端查看cookie时可以发现一个名为JSESSIONID的cookie。如图1-1所示:
JAVA培训之HttpSession原理
图1-1 cookie信息
从图1-1可以看出,这个名字为JSESSIONID的cookie的值是A147B274C704729BA01624490C898757,并且过期时间为浏览会话结束时,即表示当浏览器关闭,该cookie就死亡。其实这个cookie的值就是当前会话session的id值。
服务器每次创建的session对象,都具有一个id属性,也是唯一标识的属性。服务器创建session后,将它的id值保存在cookie中,然后发送给浏览器。浏览器在一次会话中无论访问服务器的那个资源都会带着这个cookie,服务器会根据cookie的值找到对应的session,然后从session中取出数据。下面通过一张图形象理解这个过程们,如图1-2所示:
JAVA培训之HttpSession原理
图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不存在:

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所示:
JAVA培训之HttpSession原理
图1-3 浏览器显示结果
(3)查看浏览器中保存的cookie信息,如图1-4所示:
JAVA培训之HttpSession原理
图1-4 cookie信息
由图1-4可知,该浏览器中并没有一个叫JSESSIONID的cookie,也就是说浏览器访问服务器端的SessionServlet,服务器并没有创建session对象。因为在SessionServlet中并没有调用request.getSession()方法。
(4)现在在浏览器端访问Example23应用的index.jsp页面,然后查看浏览器中的cookie信息,如图1-5所示:
JAVA培训之HttpSession原理
图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所示:
JAVA培训之HttpSession原理
图1-6 cookie信息
当在SessionServlet中添加request.getSession()代码,服务器就创建了session对象。




原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253182.html

(0)
上一篇 2022年5月7日 06:02
下一篇 2022年5月7日

相关推荐

发表回复

登录后才能评论