• (十一)会话跟踪技术之作用域(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中并返回给客户端存放在硬盘上。 
       
     
     
     
     
  • 相关阅读:
    一些关于HDFS的基本知识
    WordPress使用子主题继承和修改主题
    IQueryable、IQueryProvider接口详解
    FM并发编程练习:改写苏飞的C#多线程网站压力测试程序
    利用Webkit抓取动态网页和链接
    HTTP协议之代理
    PortalBasic Java Web 应用开发框架 v3.0.1 即将发布
    算法导论1.排序算法
    CSS题目 子元素决定父元素的大小
    使用solrj和EasyNet.Solr进行原子更新
  • 原文地址:https://www.cnblogs.com/shyroke/p/6492649.html
Copyright © 2020-2023  润新知