• 会话管理(Cookie和Session)知识点总结-DX的笔记


    软件的会话

    • 浏览器访问Web程序会产生会话,打开浏览器访问程序的第一个资源表示会话的开始,关闭浏览器表示会话的结束
    • 会话中的数据由域对象管理
    • Servlet中4种域对象:pageContext、request、session、servletContext
    • 会话的两种技术
      • Cookie:将会话数据保存在客户端的技术
      • Session:将会话数据保存在服务端的技术

    Cookie技术

    特点

    • 将数据保存在客户端
    • 只能保存字符串,不能直接保存中文,不能保存对象
    • 长度不能超过4k
    • 数据保存在文本文档中,以明码的形式保存
    • cookie的个数不能超过200,每个站点不能超过20(现在的浏览器不一定了)
    • Cookie这门技术使用多种语言都能操作,我们使用Java操作

    Cookie核心技术

    • cookie的创建

      Cookie cookie = new Cookie(String name,String value);
      
      • 1
    • cookie的设置:

      Cookie.setMaxAge(int num);//设置cookie的存活时间
      Cookie.setPath();//设置cookie的访问路径
      resp.addCookie(cookie);//将cookie发送到客户端浏览器
      Cookie[] cookies = req.getCookies();//servlet读取cookie
      
      • 1
      • 2
      • 3
      • 4
    • 从Cookie中取值

      String name = cookie.getName();
      String value = cookie.getValue();
      
      • 1
      • 2

    Cookie原理

    • cookie是如何从服务端到客户端的?
      • 程序中使用resp.addCookie(cookie)发送,本质上是使用响应头set-Cookie将cookie的内容发送到浏览器
    • cookie是如何从客户端到服务端的?
      • 浏览器在访问服务端程序的时候,会使用请求头cookie将保存的cookie内容发送到服务端.
    • 浏览器是如何知道服务端程序需要cookie?
      • 浏览器并不知道服务端程序是否需要cookie,只要访问,就会携带所有符合条件的cookie发送过去.
      • 服务端如果需要,就获取,如果不需要,就无需理会

    Cookie的细节

    Cookie的存活时间

    • 默认的cookie的存活时间是-1,表示临时保存

    • SetMaxAge(int num): 设置cookie的存活时间

      • 值为负整数:表示临时保存在浏览器的内存中,浏览器关闭时销毁,Cookie的默认值是-1.
      • 值为正整数:表示使用文本保存,浏览器关闭对于cookie没有影响,单位是秒
      • 值为0:实现删除操作,cookie没有提供显式的删除方法
    • 浏览器在携带cookie的时候,会选择哪些发送给服务端?

      • 浏览器在携带cookie的时候会进行筛选(可在浏览器中查看)
        • domain:判断是否是同一个网站,使用setDomain()设置
        • Path:如果是同一个网站下的cookie,通过这个属性判断是否是同一个路径下的,使用setPath() 设置
      • 注意:虽然可以设置,但是在开发中一般不使用

    Session技术

    特点

    • 能直接保存对象

    Session的核心技术

    • Session对象的获取(对象由web服务器创建)
      • req.getSession():获取session对象.
      • req.getSession(boolean flag):获取session对象.
    • Session对象的操作
      • String getID(): 获取session对象的id值
      • Void invalidate() : 销毁session对象
      • Void setMaxInactiveInterval(int num) : 设置session的存活时间
    • Session对象作为域对象的操作
      • SetAttribute(String name,Object value) : 给session中添加键值对
      • getAttribute(String name) : 从session中根据键获取值
      • renmoveAttribute(String name) : 给session中根据键删除键值对

    Session原理

    • session能够绑定浏览器,区分有没有分配session对象,实现区分用户.
    • Session是如何绑定浏览器的?
      • 浏览器第一次访问服务器,服务器会检查浏览器请求中携带的cookie,有没有包含一个名为JSESSIONID的cookie.如果没有,说明浏览器还没有绑定session对象,服务器会创建一个新的session对象供浏览器使用,同时会使用响应传输一个Cookie,名为JSESSIONID的cookie,值就是刚才创建的session对象的ID值,这样浏览器就保存了session的ID
      • 当浏览器再次访问服务器,会携带上次保存的cookie(JSESSIONID),服务器检查到这个cookie,就会取出cookie的值,作为session对象的ID查找服务器保存的所有session对象,看看有没有这个对象,如果有就返回,如果没有就会创建新的
    1. Web服务器是如何管理session对象?
    • 管理session对象的数据结构其实就是一个map类型的
    1. Map<String,Object>
    • <”1EA441C68C5C66A0A091357A2127CFD5”, session1>
    • <”1EA441C68C5C66A0A091357A2127CFD6”, session2>
      • <”…”, sessionN>
    • 总结:
      • session的实现需要服务器和浏览器共同作用才可以
      • 如果双方有一方出现问题,都会导致session失效

    Sesson细节

    • getSession()与getSession(boolean flag)的区别:

      • getSession()
        • 第一次访问,没有匹配的session对象,会创建一个新的session对象返回
        • 第二次访问,会查找有没有分配的session对象,如果有,返回原来分配的如果没有,返回新的,如果有,返回原有的
      • getSession(true): 效果等效于getSession()
      • getSession(false)
        • 访问的时候,会查找有没有分配的session对象,没有匹配的session对象,返回null
        • 如果有,返回原来分配的
      • 平时使用的时候,使用无参的方法即可.特殊场景下,根据需要使用有参方法
    • 设置session的存活时间:

      • 在tomcat的conf目录的web.xml文件中有如下配置信息

        <session-config>
             <session-timeout>30</session-timeout>
         </session-config>
        
        • 1
        • 2
        • 3
        • 说明默认情况下,session的失效时间是30分钟.
        • 这段配置应用于改服务器下所有的项目
        • 可以在项目的web.xml文件中重新配置当前项目的session的失效时间
      • session.setMaxInactiveInterval(int num) : 设置指定的session对象的失效时间,单位是秒

      • session.invalidate() : 销毁指定的session对象

    • 如何实现浏览器关闭,session不失效

      // 1.session对象的获取
      HttpSession session = req.getSession();
      // 2.获取session对象的ID
      String id = session.getId();
      System.out.println(id);
      // 3.重写保存sessionID的cookie
      Cookie cookie = new Cookie("JSESSIONID",id);
      cookie.setMaxAge(60*60*24);
      resp.addCookie(cookie);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    总结

    • 会话管理:浏览器和服务器会话过程中的产生的会话数据的管理。

    • Cookie技术

      new Cookie("name","value")
      response.addCookie(coookie)
      request.getCookies()
      
      • 1
      • 2
      • 3
    • Session技术

      request.getSession();
      setAttrbute("name","会话数据");
      getAttribute("会话数据")
      
      • 1
      • 2
      • 3
    • 购物车的实现使用Cookie,登陆功能使用session,登出销毁session

  • 相关阅读:
    淘宝API接入说明(商品详情数据示例)
    学习Docker笔记
    python_定时任务自动匹配数据II
    Java 默认可变性:“万亿美元级别的错误” | InfoQ 访谈
    idea中取消class文件显示所有方法的显示
    P4867 Gty的二逼妹子序列(莫队+值域分块)
    Java Web 学习笔记(二) —— JDBC
    玩一玩Spring容器
    ClassNotFoundException与NoClassDefFoundError
    雷达人体存在感应器成品,广泛应用于感应灯控制,实时精准感知方案
  • 原文地址:https://blog.csdn.net/qq_43528471/article/details/125463250