• HttpSession服务器端会话技术


    转载: https://blog.csdn.net/nihaowoshiyudong/article/details/53556619

    J2EE中的HttpSession总结:
    ①什么是session?
    session是服务器端技术,利用这个技术,服务器在运行时可以为每一个浏览器创建一个共享的session对象,由于
    session为用户浏览器独享,所以当浏览器访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户
    再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。                    
    ②session是如何创建的呢?

    当用户打开浏览器,访问某个站点时操作session时,服务器就会查找改服务器内存中有没有创建该session对象,如果已经创建那么就通过sessionid值到web服务器中找到该session并使用,如果没有web服务器就会为该浏览器分配一个独享的session,为这个session设置一个sessionid标识,sessionid中包含了浏览器信息和session所属于web服务器下的web应用,然后将sessionid封装到response对象中响应给客户端,客户端将该值存储到cookie中,然后客户端在发出请求时会将该web应用下的cookie都带给web服务器,当要调用session时就通过cookie来找到对应的session。这里要注意的是session是客户端与服务器进行数据共享的一个对象,session虽然存储在web服务器内存中,并且与一个浏览器绑定了。但是web服务器下如果有多个web站点,默认情况下同一个浏览器访问一个web服务器下的不同web站点创建的是不同的session对象。服务器是如何实现一个浏览器在一个web应用下对应一个session如下图:

    ③session的生命周期默认是30分钟这个可以在web.xml文件中看到其配置的默认时间,也可以通过修改配置来设置session的生命周期。web服务器设置session的默认生命周期如图:

    当然如果你修改的是web服务器的web.xml就会对所有web服务器下的所有web应用创建的session的生命周期生效。
    如果你修改的是web应用的web.xml就会对当前web应用创建的session的生命周期生效。如果冲突了那么以web应用下设置的优先级更高。
    当然还有两个函数可以影响session的生命周期

    setInactiveInterval():Specifies the time, in seconds, between client requests before the servlet container will invalidate this session。指的是具体的时间参数是设置servlet容器将使session失效在客户端请求之前。也就是说 这个时间是设置session懒散的时间,在此时间中session没有被访问将会失效,如果被访问了那么就重置time值再次进入懒散状态。

    Invalidate():Invalidates this session then unbinds any objects bound to it.
    使这个session失效并且使session中绑定的对象都失效。

    ④session是一个域对象,其数据机构相当于一个map,也是以键值对的形式存储数据的。session中可以存放任何Object对象。同样在session中存储键名重复的值时,该值会被覆盖。
    ⑤上面我们已经说过session是存储在服务器端的,session在一次会话中有效,那么我们在关闭浏览器后,服务器于该浏览器关联的session有没有自动销毁呢?当然是没有,因为session存储在web服务器端,当浏览器关闭时,浏览器不会发送请求给web服务器,所以session还是在生命周期没有结束时,依然存在于web服务器的内存中。那么也就是说在session生命周期还没有结束时,我们关闭浏览器,再打开浏览器访问web服务器下的web应用,该session仍然是存在的。那么我们如何来获得这个之前被我的浏览器独享的session呢?其实很简单,因为把session和浏览器进行绑定的就是一个JSESSIONID的cookie,也就是说我们在第一次调用该session时就创建一个cookie键名为JSESSIONID的cookie并且把生命周期设置为和session的一样,然后通过response对象响应给浏览器,浏览器做存储这样每次浏览器发送请求都会带上这个cookie。这样就可以实现我们以上关闭浏览器再打开浏览器时,仍然能
    访问之前浏览器独享的session。这里需要理解cookie的相关知识。如有不理解可以看看我之前写的cookie的总结:
    http://blog.csdn.net/nihaowoshiyudong/article/details/53535183

    java代码如下:

    ①创建session并且存储了JSESSIONID的cookie

    1.  
      package com.yd.servlet;
    2.  
       
    3.  
      import java.io.IOException;
    4.  
      import javax.servlet.ServletException;
    5.  
      import javax.servlet.annotation.WebServlet;
    6.  
      import javax.servlet.http.Cookie;
    7.  
      import javax.servlet.http.HttpServlet;
    8.  
      import javax.servlet.http.HttpServletRequest;
    9.  
      import javax.servlet.http.HttpServletResponse;
    10.  
      import javax.servlet.http.HttpSession;
    11.  
       
    12.  
      /**
    13.  
      * Servlet implementation class CreateSession
    14.  
      */
    15.  
      @WebServlet("/CreateSession")
    16.  
      public class CreateSession extends HttpServlet {
    17.  
      private static final long serialVersionUID = 1L;
    18.  
       
    19.  
      /**
    20.  
      * @see HttpServlet#HttpServlet()
    21.  
      */
    22.  
      public CreateSession() {
    23.  
      super();
    24.  
      // TODO Auto-generated constructor stub
    25.  
      }
    26.  
       
    27.  
      /**
    28.  
      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    29.  
      */
    30.  
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    31.  
      request.setCharacterEncoding("utf-8");
    32.  
      //第一次获得session时创建该session
    33.  
      HttpSession session=request.getSession();
    34.  
      session.setAttribute("name", "TomCat");
    35.  
      //存储JSESSIONID这个cookie使其和session的生命周期一样
    36.  
      Cookie cookie=new Cookie("JSESSIONID", session.getId());
    37.  
      //设置cookie的生命周期
    38.  
      cookie.setMaxAge(30*60);
    39.  
      response.addCookie(cookie);
    40.  
      //response.sendRedirect("/SessionTest/GetSessionServlet");
    41.  
      }
    42.  
       
    43.  
      /**
    44.  
      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    45.  
      */
    46.  
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    47.  
      // TODO Auto-generated method stub
    48.  
      doGet(request, response);
    49.  
      }
    50.  
       
    51.  
      }

    浏览器接受的响应头如图:

    ②关闭浏览器

    ③再次打开浏览器发送请求同一web应用下的资源,java代码如下:

    1.  
      package com.yd.servlet;
    2.  
       
    3.  
      import java.io.IOException;
    4.  
      import javax.servlet.ServletException;
    5.  
      import javax.servlet.annotation.WebServlet;
    6.  
      import javax.servlet.http.HttpServlet;
    7.  
      import javax.servlet.http.HttpServletRequest;
    8.  
      import javax.servlet.http.HttpServletResponse;
    9.  
      import javax.servlet.http.HttpSession;
    10.  
       
    11.  
      /**
    12.  
      * Servlet implementation class GetSessionServlet
    13.  
      */
    14.  
      @WebServlet("/GetSessionServlet")
    15.  
      public class GetSessionServlet extends HttpServlet {
    16.  
      private static final long serialVersionUID = 1L;
    17.  
       
    18.  
      /**
    19.  
      * @see HttpServlet#HttpServlet()
    20.  
      */
    21.  
      public GetSessionServlet() {
    22.  
      super();
    23.  
      // TODO Auto-generated constructor stub
    24.  
      }
    25.  
       
    26.  
      /**
    27.  
      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    28.  
      */
    29.  
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    30.  
      //获得session中的属性
    31.  
      request.setCharacterEncoding("utf-8");
    32.  
      HttpSession session=request.getSession();
    33.  
      String name=(String) session.getAttribute("name");
    34.  
      System.out.println("关闭浏览器后显示的session内容:"+name+"id值"+session.getId());
    35.  
      //显示的结果
    36.  
      //关闭浏览器后显示的session内容:TomCat id值8B49F6CBD34BFDDEE43BA58912FA65D9
    37.  
      }
    38.  
       
    39.  
      /**
    40.  
      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    41.  
      */
    42.  
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    43.  
      // TODO Auto-generated method stub
    44.  
      doGet(request, response);
    45.  
      }
    46.  
       
    47.  
      }

    请求信息头如下:

    可见请求信息头的JSESSIONID和响应信息头的JSESSIONID的值一样。所以通过JSESSIONID就能找到浏览器独享的session,无论是否是一次会话,只要session生命周期没有结束,都可以访问到该session。

  • 相关阅读:
    iOS项目之自定义斜向文字标签
    iOS进阶之两个模型数组的去重方法
    iOS进阶之正则表达式
    iOS项目之使用开关控制日志输出的功能
    iOS进阶之UDP代理鉴权过程
    990元外贸企业建站方案
    ¥990起,性价比最高的建站服务。
    PHP调用WEBSERVICE接口常见问题答疑以及总结
    Python消息队列工具 Python-rq 中文教程
    电商网站的用户停留时间越长越好吗?我看未必。
  • 原文地址:https://www.cnblogs.com/mybatis/p/9358654.html
Copyright © 2020-2023  润新知