• Cookie基本使用 [JavaWeb][Servlet]


    Cookie基本使用

    Cookie : 客户端会话技术, 将数据保存到客户端, 以后每次请求都携带Cookie数据进行访问

    • 这个时候有的人会说: 那么我们的Cookie技术也是每次请求的时候都携带Cookie数据进行访问, 难道不是和将HTTP协议设置为无状态的协议一样?
      • 不是的, 即使Cookie技术是使用Cookie之后每次请求的时候都会携带Cookie数据, 但是我们的Cookie中存储的仅仅只是我们需要共享的数据, 所以数据量比较小, 但是如果将HTTP协议设置为无状态的协议的话我们每次的时候就会将上一次的数据全部携带, 所以数据量就会很大, 并且使用Cookie还比较灵活
    • 也就是我们客户端请求服务端之后, 我们服务端可以创建一个Cookie对象, 一旦我们创建这个Cookie对象并使用这个Cookie对象存储数据并以响应头的形式响应给客户端之后, 客户端在解析到对应的响应头之后就会将对应的Cookie对象存储到客户端浏览器的内存中,那么当浏览器再次请求这个服务器的时候, 就会将当前服务器所在域名之下的所有Cookie以请求头的形式发送到服务器中, 然后我们的服务器中就可以获取到Cookie对象, 并且可以进行筛选, 拿到要使用的共享数据"
      • 注意: 默认情况下cookie会存储到客户端浏览器的内存中, 但是我们还可以设置, 让其存储到客户端本机的本地存储空间中(硬盘中)

    Cookie基本使用之发送Cookie

    1. 创建Cookie对象, 设置数据
    Cookie cookie = new Cookie("key","value");
    
    • 1
    1. 发送Cookie到客户端 : 使用response对象
      • 因为我们的Cookie其实是通过请求头的形式发送到客户端的
    response.addCookie(cookie);
    
    • 1

    当客户端浏览器中获得到了Cookie对象之后, 我们就可以去查看到这个Cookie对象:

    • 但是每个浏览器中查看Cookie对象的方式可能不尽相同, 这里我们以谷歌浏览器为例:
      1. 打开设置
      2. 隐私设置和安全性
      3. Cookie及其他网站数据
      4. 查看所有Cookie和网站数据
      5. 然后我们查询localhost(因为我们此时服务端也是在本机, 就是输入服务端所在ip地址或者域名)
    • 比如我们从浏览器中获取的Cookie如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKt3DWIm-1656609965476)(E:\非凡英才\JavaWeb开发\Servlet\图解\从浏览器中获取的Cookie.png)]

    Cookie的基本使用之获取Cookie

    1. 获取客户端携带的所有Cookie, 使用request对象
    Cookie[] cookies = request.getCookies();
    
    • 1
    • 客户端浏览器在访问一个服务器时会将在该服务器域名之下产生的所有Cookie都携带上以请求头的形式发送给对应服务器
    1. 遍历Cookies[], 获取每一个Cookie对象

    2. 使用Cookie对象的方法来获取数据

    Cookie.getName(); //获取Cookie对象中保存的键
    
    Cookie.getValue(); //获取Cookie对象中保存的值
    
    • 1
    • 2
    • 3
    • 我们一般都是在遍历Cookie[]的过程中使用Cookie.getName()方法判断是否是我们想要的键, 如果找到了是指定的键之后我们再使用Cookie.getValue()方法获取对应的值

    举例说明Cookie的使用:

    • 给出MainServlet类, 这个Servlet中我们第一次创建Cookie对象并发送给客户端
    package com.ffyc.demo;
    
    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 java.io.IOException;
    
    @WebServlet("/main")
    public class MainServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //创建Cookie对象, 设置数据
            Cookie cookie = new Cookie("name","miaomiao");
    
            //发送cookie到客户端, 使用response对象
            resp.addCookie(cookie);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 给出MainServlet2类, 这个Servlet类中我们主要用来获取客户端转过来的Cookie对象, 并进行查找后输出
    package com.ffyc.demo;
    
    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 java.io.IOException;
    
    @WebServlet("/main2")
    public class MainServlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取从客户端发送过来的Cookie对象[]
            Cookie[] cookies = req.getCookies();
    
            //使用增强for循环遍历cookies数组
            for (Cookie c :
                    cookies) {
                String name = c.getName();
                //判断如果是我们要查询的键的时候才继续去进入到if判断中, 获取出对应的值, 然后打印输出到控制台
                if ("name".equals(name)) {
                    String value = c.getValue();
                    System.out.println(name + ":" + value);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    is-is表与消息及认证 详解
    【RT-Thread】nxp rt10xx 设备驱动框架之--hwtimer搭建和使用
    百度率先在元宇宙举办大会,李彦宏:中国迎来AI黄金十年
    Linux 对整个系统备份和还原
    PHP redis list
    【Axure高保真原型】多图表动态切换
    xavier china server
    天龙八部科举答题问题和答案(全8/8)
    生活中的视音频技术
    手工打造基于MM32F5微控制器的MicroPython开发板
  • 原文地址:https://blog.csdn.net/m0_57001006/article/details/125551084