• Head First Servlets & JSP 学习笔记 第六章 —— 会话状态


    MVC中的M(模型),通常就是一个普通的类,这个类里面的信息就是业务逻辑。

    会话(Session)

    我们可以使用一个HttpSession对象,来保存横跨多个请求的会话状态。

    HTTP协议使用的是无状态连接。客户浏览器与服务器建立连接,发出请求,得到响应,然后关闭连接。换句话说,连接只为一个请求/响应存在。对于Web容器而言,每一个连接都是一个新的客户。

    那么Web容器怎么记住这是同一个客户,还是另外一个新客户呢?这个时候,客户就需要一个唯一的会话ID。

    对于一个客户的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户。这个客户在以后的每一个请求中再把会话ID发到Web容器,这样,Web容器就可以区分不同的客户了。

    那么又有一个问题:客户和Web容器怎么交换会话ID这个信息呢?答案就是:通过cookie。

     1 HttpSession session1 = request.getSession(); //无参数版本的getSession(),无论如何都会返回一个会话,要么是新建的,要么是之前就有的
     2 if(session1.isNew()){
     3     syso("这是一个新创建的会话");
     4 else
     5     syso("这是一个已有的会话");
     6 
     7 HttpSession session2 = request.getSession(false); //有参数版本的getSession(),返回null或者一个之前就有的会话
     8 if(null == session2)
     9     syso("这个会话不存在“);
    10 else
    11     syso("这是一个已有的会话");

    那么又有一个问题:有些客户会禁用cookie,这怎么办?答案就是:URL重写。

    也就是说,为了能识别是同一个客户还是新客户,需要交换会话ID,最简单的交换办法是用cookie,不行再用URL重写

    删除不再需要的会话?会话对象占用着资源,Web容器怎么确定这个会话要不要删除?

    会话有三种死法:①超时 ②主动调用invalidate()方法 ③应用结束

    cookie实际上就是在客户和服务器之间交换的一小段数据(一个名/值对)。

    1 Cookie cookie = new Cookie("username", "2bconfident"); //创建一个新的cookie对象
    2 cookie.setMaxAge(30*60); //设置cookie在浏览器上存活的最大时间:30分钟

    HttpSession的重要里程碑,一生中的重要时刻:创建和撤销会话。

    前面的章节,我们知道在分布式应用上,有多个服务器,也就有多个JVM。一个JVM有一个ServletContext,一个JVM有多个Servlet,所以有多个ServletConfig,一个Servlet对应一个ServletConfig。

    但是HttpSession对象,无论有多少JVM,一个应用中只有一个HttpSession对象,只有一个SessionID(会话ID)。

  • 相关阅读:
    Streaming+Sparksql使用sql实时分析 rabbitmq+mongodb+hive
    几种指定链接库搜索路径
    配置ssh
    无交换机情况下的集群互联
    请找出至少一个由递推关系 a(i) = a(i – 1) + a(i – 2) 生成的数列,使得当 n 趋于 (√5+1)/2的数列
    hdu 4027 Can you answer these queries?
    hdu 4022 Bombing
    hdu 4034
    hiho 第七周 完全背包
    hiho 第六周 01背包
  • 原文地址:https://www.cnblogs.com/czp2bconfident/p/8892314.html
Copyright © 2020-2023  润新知