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 [java] view plain copy package com.yd.servlet;    import java.io.IOException;  import javax.servlet.ServletException;  import javax.servlet.annotation.WebServlet;  import javax.servlet.http.Cookie;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import javax.servlet.http.HttpSession;    /**  * Servlet implementation class CreateSession  */  @WebServlet("/CreateSession")  public class CreateSession extends HttpServlet {      private static final long seriawww.saiche55.cnlVersionUID = 1L;     www.gouyiflb.cn           /**      * @see HttpServlet#HttpServlet()  www.gouyifl.cn    */      public CreateSession() {          super();   www.senta7.net       // TODO Auto-generated constructor stub      }        /**      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)      */      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          request.setCharacterEncoding("utf-8");          //第一次获得session时创建该session          HttpSession session=request.getSession();          <span style="color:#FF0000;">session.setAttribute("name", "TomCat");</span>          <span style="color:#FF0000;">//存储JSESSIONID这个cookie使其和session的生命周期一样          Cookie cookie=new Cookie("JSESSIONID", session.getId());          //设置cookie的生命周期          cookie.setMaxAge(30*60);          response.addCookie(cookie);</span>          //response.sendRedirect("/SessionTest/GetSessionServlet");      }        /**      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)      */      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, www.yxin7.com IOException {      www.chuangshi88.cn    // TODO Auto-generated method stub          doGet(request, response);      }    }  浏览器接受的响应头如图:

②关闭浏览器 ③再次打开浏览器发送请求同一web应用下的资源,java代码如下: [java] view plain copy package com.yd.servlet;    import java.io.IOException;  import javax.servlet.ServletException;  import javax.servlet.annotation.WebServlet;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import javax.servlet.http.HttpSession;    /**  * Servlet implementation class GetSessionServlet  */  @WebServlet("/GetSessionServlet")  public class GetSessionServlet extends HttpServlet {      private static final long serialVersionUID = 1L;       www.boyuanyl.cn        /**      * @see HttpServlet#HttpServlet()   www.ycyc66.cn/   */      public GetSessionServlet() {          super();          // TODO Auto-generated constructor stub      }        /**      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)      */      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          //获得session中的属性          request.setCharacterEncoding("utf-8");      www.yunfeizao.cn    HttpSession session=request.getSession();          <span style="color:#FF0000;">String name=(String) session.getAttribute("name");          System.out.println("关闭浏览器后显示的session内容:"+name+"id值"+session.getId());          //显示的结果          //关闭浏览器后显示的session内容:TomCat id值8B49F6CBD34BFDDEE43BA58912FA65D9</span>      }        /**      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)      */      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          // TODO Auto-generated method stub          doGet(request, response);      }    }  请求信息头如下:

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

J2EE中的HttpSession的更多相关文章

  1. 单点登录与消息队列以及在J2EE中的实现方案

    前言 这次为大家简单介绍两个在WEB开发中经常使用的概念——单点登录和消息队列以及具体到J2EE中的一些实现方案.本文原创性的工作比较少,主要是一些总结概括和自己的理解. 单点登录SSO SSO的业务 ...

  2. J2EE中几个常用的名词解释

      1.web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接和容器中的环境变量接接口互,不必关注其它系统问题.主要有WEB服务器来实现.例如:TOM ...

  3. JNDI 在 J2EE 中的角色

    JNDI 在 J2EE 中的角色 Spring整合HIbernate时,三种数据库连接池的配置和比较 Tomcat 6 JNDI数据源详解 Tomcat 6 --- JNDI详解 Spring整合HI ...

  4. 在J2EE中属于Web层的组件有(选择1项)

    在J2EE中属于Web层的组件有(选择1项) A. HTML B. EJB C. Applet D. JSP 解答:D

  5. 【转贴】J2EE中的13种技术规范

    J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单 ...

  6. JSP中的 HttpSession、pageContext对象

    pageContext 隐含对象对应javax.servlet.jsp.PageContext,都自动的被加入至pageContext中, 您可以由它来取得与JSP相关的对应之Servlet对象,像是 ...

  7. J2EE中EL表达式

    EL全名为Expression Language. EL语法很简单,主要的语法结构是${sessionScope.user.sex}所有EL都是以${为起始.以}为结尾的. 上述EL范例的意思是:从S ...

  8. J2EE中你必须了解的13种技术规范

    1)JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据 ...

  9. (转)J2EE中13个规范

       今天在做连接oracle数据库的时候,感受到了什么是规范.平时听到别人说学习j2ee一定要学习他的十三个规范,大概的知道每个规范是做什么的,每个“接口”是做什么的.          很早就听过 ...

随机推荐

  1. 揭秘淘宝自主研发的文件系统:TFS

    目前,国内自主研发的文件系统可谓凤毛麟角.淘宝在这一领域做了有效的探索和实践,Taobao File System(TFS)作为淘宝内部使用的分布式文件系统,针对海量小文件的随机读写访问性能做了特殊优 ...

  2. 微信.NET 微信开发 自己主动内容回复 ASP.NET C#代码

    微信开发中,首先遇到的问题就是处理怎样接收和响应用户消息 , 本文将向大家介绍一下方法和关键的代码. 本文使用的接口库是  :https://github.com/chendong152/Weixin ...

  3. 编译Android4.3内核源代码

     --------------------------------------------------------------------------------------------------- ...

  4. java验证码(采用struts2实现)转

    第一步:编写验证码的Action package com; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...

  5. textarea文本域宽度和高度(width、height)自己主动适应变化处理

    文章来源:http://www.cnblogs.com/jice/archive/2011/08/07/2130069.html <HTML> <HEAD> <TITLE ...

  6. -----------------------------MVC模式理解-----------------------------

    1.用户发送请求到控制层: 2.控制层将接受到的请求转发到模型层: 3.模型层将请求结果转发到控制层: 4.控制层将模型层返回的结果进行视图渲染: 5.视图渲染后返回(jstl): 6.将视图展示给用 ...

  7. iOS之XIB拖拽scrollView

    在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和AutoLayout 结合使用,相对来说有点复杂.根据实践,我说一 ...

  8. 使用Netty进行Android与Server端通信实现文字发送接收与图片上传

    ANOTHER TITLE: Let’s use netty to achieve text send and receive and  image transfer to server based ...

  9. 一种通用数据采集的schema定义形式

    { "name": "凤凰金融", "notice": { "data": "attribute", ...

  10. Working with BeforeProperties and AfterProperties on SPItemEventReceiver

    As many of you know, event receivers are a great way to hook into various SharePoint events.  These ...