• 关于B/S结构系统的会话机制(session机制)


    关于B/S结构系统的会话机制(session机制)

    1. 什么是会话?

      • 用户打开浏览器,进行一系列操作,最后关闭浏览器,这个整个过程叫做一次会话。
      • 真正意义上,会话是session对象的创建到结束的过程。
      • 一个session对应一个会话
      • 服务器端有一个对象叫做session
      • 一次会话对应n次请求
    2. 什么是请求:用户在浏览器上点击了一下,然后页面停下来,可以认为是一次请求。

    3. 在java的Servlet规范当中,session对应的类名:HttpSession

    4. session机制其实是一种规范,然后不同的语言对这种会话机制都有实现

    5. session对象最主要的作用是:保存会话状态。

    6. 为什么需要session对象保存会话状态呢?

      • 因为HTTP协议是一种无状态协议
      • 什么是无状态?请求的时候,B和S是连接的,但是请求结束之后连接就断了。
      • 无状态的目的?减轻服务器压力。
      • 只要B和S断开了,服务器时不知道浏览器关闭的。
    7. 为什么许多网站有“安全退出”按钮

      • 因为你如直接点×退出该网站,服务器时不知道你退出了的,会话就没有彻底关闭。但是如果你点了安全退出,服务器就知道你退出了,这时候会话才彻底关闭,session对象也被销毁了。
      • 为什么没有彻底关闭,因为HTTP是无状态协议,你请求时和服务器建立了连接,但是请求结束后连接就直接断开了,那么你是否关闭浏览器服务器是不知道的,也就是说就算你退出了该页面,在规定时间内你的session对象还存在,对象中还有很多信息。
      • session对象是采用超时关闭的机制销毁的。
    8. 一个用户对应一个session,在不同的浏览器打开属于不同的用户。

      例如:张三打开了一个浏览器A,王五打开了浏览器B,访问服务器后,在服务器会生成:

      ​ 张三专属的session对象

      ​ 王五专属的session对象

    9. 为什么不用request或者ServletContext对象保存会话状态?

      • request是一次请求一个对象
      • ServletContext是服务器启动时创建,服务器关闭时销毁,并且只有一个
      • request的作用域太小,ServletContext的作用域太大
      • request(请求域)< session(会话域) < application(ServletContext应用域)
      • ServletContext的作用域为什么太大,例如在一个服务器里面有100个用户,如果把用户登录成功的数据放在应用域中,就代表这100个人都登录成功了,显然不合理。
    10. 怎么获取session?从服务器中获取session对象,如果没有则新建

      HttpSession session = request.getSession();
      
      • 1
    11. 如果以上方法传了参数,代表从服务器中获取当前session对象,如果获取不到,则不会新建返回一个对象。

      HttpSession session = request.getSession(false);
      
      • 1
    12. session的实现原理:

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0aGGQMM-1669280189349)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667393684526.png)]
      • 在web服务器中有一个session列表,类似于map集合
      • key为sessionid
      • value为session对象
      • 用户第一次发送请求的时候:服务器会创建一个新的session对象,同时给session对象生成一个id,然后web服务器将session的id发送给浏览器,浏览器的session的id保存在浏览器的缓存中。(可以f12看响应头部)
      • 用户第二次请求时,会自动将浏览器中的sessionid自动发送给服务器,服务器获取到sessionid然后从session列表中查找到对应的session对象。(可以f12看请求头部)
      • 关闭浏览器,内存消失,cookie消失,sessionid消失,等同于会话结束
    13. session对象什么时候销毁

      • 超时销毁------浏览器可能一直没关,但是超时了,session就没了

      • 手动销毁-----安全退出按钮

        • session.invalidate(); //手动销毁session
          
          • 1
    14. 设置超时时长

          <session-config>
              <session-timeout>30session-timeout>
          session-config>
      
      • 1
      • 2
      • 3
    15. cookie禁用:

      • 服务器正常发送cookie给浏览器,但是浏览器拒收。
      • 导致每次是新的session
      • 但是服务器产生的session对象没有销毁
      • 禁用了如何实现session机制?
      • 注意:禁用了浏览器基本上用不了了
    16. JSP九大内置对象中,有session对象。因为JSP也是一个Servlet

      • 这样会产生什么?

        • 如果登录界面是JSP,那么在此次会话中会自动创建一个session
        • 但是登录界面如果登录成功会往session里面放数据,所以登录失败虽然有session但是不要紧
      • 如何禁用JSP中创建的session?

        • 让jsp的九大内置对象没有session对象

          <%@page session="false"%>
          
          • 1
  • 相关阅读:
    3D~RPG游戏的制作
    会声会影2024有哪些新功能?好不好用
    redis大全
    体验 win10 下 oceanbase 数据库
    【技术积累】Linux中的命令行【理论篇】【六】
    智慧城市数字孪生技术方案,建设可视化系统
    [附源码]计算机毕业设计微录播室预约管理系统Springboot程序
    分布式id(1)
    优化器scipy.optimize参考指南
    聊聊自动化测试想法
  • 原文地址:https://blog.csdn.net/qq_52025040/article/details/128022191