zoukankan      html  css  js  c++  java
  • (十一)会话跟踪技术之作用域(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中并返回给客户端存放在硬盘上。 
       
     
     
     
     
  • 相关阅读:
    668. Kth Smallest Number in Multiplication Table
    658. Find K Closest Elements
    483. Smallest Good Base
    475. Heaters
    454. 4Sum II
    441. Arranging Coins
    436. Find Right Interval
    410. Split Array Largest Sum
    392. Is Subsequence
    378. Kth Smallest Element in a Sorted Matrix
  • 原文地址:https://www.cnblogs.com/shyroke/p/6492649.html
Copyright © 2011-2022 走看看