【web】理解 Cookie 和 Session 机制

简介: 【web】理解 Cookie 和 Session 机制

 🤞目录🤞

 

💖1. 理解Cookie

💖2. 理解会话机制(Session)

💖3. 核心方法

3.1 HttpServletRequest 类中的相关方法

3.2 HttpServletResponse 类中的相关方法

3.3 HttpSession 类中的相关方法

3.4 Cookie 类中的相关方法

💖4. Cookie 和 Session 的区别

4.1 只存Cookie

4.2 只取Cookie


【大家好,我是爱干饭的猿,如果喜欢这篇文章,点个赞👍,关注一下吧,后续会持续分享每日一题和SSM其他重要知识点总结

上一篇文章:《【SSM】初识Spring & 存取Bean对象》


🎫1. 理解Cookie

HTTP 协议自身是属于 “无状态” 协议的

“无状态” 的含义指的是:默认情况下 HTTP 协议的客户端和服务器之间的本次通信和下次同行没有直接联系

但是在实际开发中,我们很多时候都需要知道请求和请求间的关系,比如登录某个网站后,再次访问的时候服务器就能知道你是否已经登陆过了。

image.gif编辑

图中的 “令牌” 就存储在Cookie 字段中,“令牌”就类似于一张VIP 卡或通行证,当你有这张令牌后就能进行后续的访问了。

Cookie实际上是一小段的⽂本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使⽤response向客户端浏览器颁发⼀个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie⼀同提交给服务器。服务器检查该Cookie,以此来辨认⽤户状态。服务器还可以根据需要修改Cookie 的内容。

而此时在服务器这边就需要记录令牌信息,以及令牌对应的用户信息,这个就是Session 机制做的工作。


🎫2. 理解会话机制(Session)

服务器在同一时间可能会收到许多请求,服务器要区分清楚每个请求的用户是谁,就需要在服务器记录每个用户的令牌和用户信息。

所有会话的本质是一个“哈希表”,存储一些键值对结构,key 就是令牌的 ID(token/sessionId), value 就是 用户信息。

sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法)

image.gif编辑

    • 当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId / token 返回给客户端. (例 如通过 HTTP 响应中的 Set-Cookie 字段返回).
    • 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token. (例如通过 HTTP 请求 中的 Cookie 字段带上).
    • 服务器收到请求之后, 根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息, 再进行后续操作.

    注意:Servlet 的Session 是保存在内存中,重启服务器Session 数据就会消失,相当于重新开始一个进程。


    🎫3. 核心方法

    3.1 HttpServletRequest 类中的相关方法

    image.gif编辑

    3.2 HttpServletResponse 类中的相关方法

    image.gif编辑

    3.3 HttpSession 类中的相关方法

    一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息.

    image.gif编辑

    3.4 Cookie 类中的相关方法

    每个 Cookie 对象就是一个键值对.

    image.gif编辑

      • HTTP 的 Cooke 字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie 对象
      • 通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对
      • 通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对

      a. 首次访问

      @WebServlet("/first-visit")
      public class FirstVisitServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // // false 不会新增加柜子,ture 会新增柜子
              HttpSession session = req.getSession(true);
              // 记录
              session.setAttribute("Date",new Date());
              resp.setCharacterEncoding("utf-8");
              resp.setContentType("txt/plain");
              resp.getWriter().print("办理会员成功!");
          }
      }

      image.gif

      b. 首次访问后得到Cookie 就能发出带有Cookie 的请求

      @WebServlet("/get-time")
      public class GetCookie extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              resp.setCharacterEncoding("utf-8");
              resp.setContentType("txt/plain");
              PrintWriter writer = resp.getWriter();
              // false 不会新增加柜子,ture 会新增柜子
              HttpSession session = req.getSession(false);
              if(session == null){
                  writer.println("没有柜子");
                  return;
              }
              Object o = session.getAttribute("Date");
              if(o == null){
                  writer.println("有柜子但是会员信息为空");
                  return;
              }
              Date date = (Date) o;
              writer.println("有会员,会员信息为:" + date);
          }
      }

      image.gif


      🎫4. Cookie 和 Session 的区别

        • Cookie 是客户端的机制,Session 是服务器端的机制.
        • Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.

               完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是            token / sessionId

               Session 中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递.

        4.1 只存Cookie

        @WebServlet("/only-set-cookie")
        public class OnlySetCookie extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                Cookie cookie1 = new Cookie("name","xiao");
        //        Cookie 其它属性
        //        cookie1.setMaxAge(60);   // 设置过期时间
        //        cookie1.setComment();  // 设置Cookie 注释
        //        cookie1.setDomain();   // 设置支持的域名,可以让支持根域名 域名增大范围
        //        cookie1.setPath();     // 设置支持的路径 路径缩小范围,一般默认为"/",根目录下都带Cookie
        //        // 其它
                resp.addCookie(cookie1);
                Cookie cookie2 = new Cookie("gender","male");
                resp.addCookie(cookie2);
            }
        }

        image.gif

        4.2 只取Cookie

        @WebServlet("/only-get-cookie")
        public class OnlyGetCookie extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                Cookie[] cookies = req.getCookies();
                for (Cookie cookie : cookies) {
                    System.out.println(cookie.getName() +" => "+cookie.getValue());
                }
            }
        }

        image.gif


        本次分享就到这里,如果你喜欢这篇文章,请点赞关注吧,或者如果你对文章有什么困惑,可以私信我。

        🏓🏓🏓

        相关文章
        |
        13天前
        |
        存储 安全 搜索推荐
        理解Session和Cookie:Java Web开发中的用户状态管理
        理解Session和Cookie:Java Web开发中的用户状态管理
        40 4
        |
        17天前
        |
        存储 缓存 网络协议
        计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
        计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
        |
        1月前
        |
        缓存 Java Spring
        servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
        文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
        151 3
        servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
        |
        28天前
        |
        存储 安全 数据安全/隐私保护
        Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
        【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
        19 1
        |
        2月前
        |
        存储 缓存 数据处理
        php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
        本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
        php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
        |
        2月前
        |
        存储 前端开发 Java
        JavaWeb基础7——会话技术Cookie&Session
        会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
        JavaWeb基础7——会话技术Cookie&Session
        |
        2月前
        |
        存储 安全 NoSQL
        Cookie、Session、Token 解析
        Cookie、Session、Token 解析
        59 0
        |
        2月前
        |
        存储 JSON 数据安全/隐私保护
        Cookie + Session 的时代已经过去了?
        在探讨“Cookie + Session”这一经典组合是否已经过时的议题时,我们首先需要理解它们在Web应用认证和会话管理中的历史地位与当前面临的挑战。随着Web技术的飞速发展,特别是无状态服务、OAuth、JWT(JSON Web Tokens)等技术的兴起,这一传统机制确实面临了前所未有的变革压力。但说它“完全过去”或许过于绝对,因为它在特定场景下仍发挥着重要作用。
        36 0
        |
        3月前
        |
        C# 开发者 Windows
        WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
        【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
        241 0
        |
        3月前
        |
        存储 JavaScript 前端开发
        Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
        Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
        186 1