(十一)会话跟踪技术之作用域(request、session、servletContext)

一、作用域范围
  •     Request       保存的键值仅在下一个request对象中可以得到,作用于两个有请求关系的页面
  •     Session        它是一个会话范围,相当于一个局部变量,从Session第一次创建直到关闭,数据都一直 保存,每一个客户都有一个Session,所以它可以被客户一直访问,只要Session没有关闭和超时即浏览器关闭。同一个浏览器对象。
  •     servletContext    它代表了servlet环境的上下文,相当于一个全局变量,即只要某个web应用在启动中,这个对象就一直都有效的存在,所以它的范围是最大的,存储的数据可以被所有用户使用,只要服务器不关闭,数据就会一直都存在。同一个服务器对象

 

二、具体应用
  • scopeServlet.java 设置各值(scopeServlet.java 和getScopeServlet.java没有请求关系,即两者没有互相跳转)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 request.setAttribute("num", "10");
 request.getSession().setAttribute("num", "100");
 this.getServletContext().setAttribute("num", "1000");}
  • getScopeServlet.java 获取设置的值
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 System.out.println(request.getAttribute("num"));
 System.out.println(request.getSession().getAttribute("num"));
 System.out.println(this.getServletContext().getAttribute("num"));
 }
结果 :
  1.  先访问scopeServlet.java,再访问getScopeServlet.java,
可见,requst的值是空的,因为两个页面没有请求关系,所以requst的值无法传递。
 
  2.  在1的操作之后,关闭浏览器 ,再打开 然后访问getScopeServlet.java
可见,requst的值依旧空,但session对象的值也消失了,因为一个浏览器只有一个session对象。
  3.  重启服务器,然后访问getScopeServlet.java
全部值都是空的。
 
 

三、注意

  •     要实现scopeServlet.java和getScopeServlet.java的跳转即请求,只需要在scopeServlet.java文件中添加request.getRequestDispatcher("getscope").forward(request,response);
    getRequestDispatcher("getscope")跳转到getscope,getscope可以是servlet文件也可以是html文件,forward(request,response)指向前跳转,并把requst传过去,所以getscope页面可以那得到本页面的requst的值。具体请看serlvet通信。
 
  •  首先说明一点,在通常意义上,session所能发挥作用是基于cookie机制。针对所需要解释的问题,做这样一个假设:我们第一次访问一个网页。当客户端发送请求后,服务端会建立一个针对此请求发出客户的session对象,而且每个session都会有一个sessionID。服务端会自动将这个sessionID作为一个cookie附加到response上返回给客户端,这个cookie存放在浏览器内存中。我们每次对此网页发送的request都会附带着这个cookie,服务端收到这个请求后会都去cookie中取得这个sessionID,然后查询服务端是否存在一个对应此ID的session对象。如果有,可以直接使用此session;如果没有,则会新建一个。当浏览器关闭后,其所占的内存就会是放掉,cookie自然也就被清除了,此时我们不再保存有这个sessionID。所以再打开浏览器访问同一个页面时,由于没有sessionID,也就查不到对应的session对象,此时重新创建一个新的session对象。
    那当我们关闭浏览器之后,服务器端原来的session对象是否还存在呢?答案是肯定的。服务端根本不知道我们是否关闭了浏览器,也不关心这个。客户端与服务端之间进行通信的唯一途径就是通过请求。服务器有自己的一套机制来管理session,比如多长时间会清除没有使用过的session对象,等等。 
     
            所以说,关闭浏览器session就被清除只是我们所看到的表面现象(实际上是新建了一个session对象),通常情况下,服务器并不会马上清除session对象,但这个根据服务端的设定而不同。 
     
            PS:cookie一般分为两种:一种是会话cookie,即服务端为session自动创建的cookie,这个cookie存放在浏览器进程中。另一种是可以存放在硬盘上的,可以通过服务端的某些设置,将一些信息放到cookie中并返回给客户端存放在硬盘上。 
     
 
 
 
 
原文地址:https://www.cnblogs.com/shyroke/p/6492649.html