Cookie

JavaWeb 专栏收录该内容
18 篇文章 4 订阅

1. 会话技术

  1. 会话的概念

    一次会话中包含多次请求和响应

    一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止

  2. 会话的功能

    在一次会话内的多次请求间共享数据

  3. 会话技术的分类

    1. 客户端会话技术:Cookie
    2. 服务器端会话技术:Session

2. Cookie 的概念

客户端会话技术,将数据保存到客户端

3. Cookie 快速入门

  1. 使用步骤

    1. 创建 Cookie 对象,绑定数据

      new Cookie(String name, String value) 
      
    2. 发送 Cookie 对象

      response.addCookie(Cookie cookie) 
      
    3. 获取 Cookie,拿到数据

      Cookie[] request.getCookies()  
      
  2. Cookie 练习

    在 CookieDemo1 中创建 Cookie 并发送,在 CookieDemo2 获取 Cookie

    @WebServlet("/CookieDemo1")
    public class CookieDemo1 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 创建 Cookie 对象,绑定数据
            Cookie cookie = new Cookie("cookie1","hello");
            // 发送 Cookie 对象
            response.addCookie(cookie);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    @WebServlet("/CookieDemo2")
    public class CookieDemo2 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 获取 Cookie,拿到数据
            Cookie[] cookies = request.getCookies();
            // 遍历 cookies 数组,获取数据
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    String name = cookie.getName();
                    String value = cookie.getValue();
                    System.out.println(name + ":" + value);
                }
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    

4. Cookie 的实现原理

在这里插入图片描述

基于响应头 set-cookie 和请求头 cookie 实现的

5. Cookie 的细节

5.1 一次可以发送多个 Cookie 吗?

可以的。创建多个 Cookie 对象,使用 response 调用多次 addCookie 方法发送 Cookie 即可

@WebServlet("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建 Cookie 对象,绑定数据
        Cookie cookie1 = new Cookie("cookie1","hello");
        Cookie cookie2 = new Cookie("cookie2","world");
        // 发送 Cookie 对象
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

5.2 Cookie 在浏览器中保存多长时间?

  1. 默认情况下,当浏览器关闭后,Cookie 数据被销毁
  2. 设置持久化存储
    • void setMaxAge(int seconds)
    • 正数:将 Cookie 数据写到硬盘的文件中,并指定 Cookie 存活时间,时间到后,Cookie 文件将被自动删除。
    • 负数:默认值
    1. 零:删除 Cookie 信息

5.3 Cookie 能不能存储中文?

  1. 在 Tomcat 8 之前,Cookie 中不能直接存储中文数据。
  2. 在 Tomcat 8 之后,Cookie 支持中文数据。但特殊字符(如空格)还是不支持,建议使用 URL 编码存储,URL 解码解析。

5.4 Cookie 在不同项目中能不能共享?

  1. 假设在同一个 Tomcat 服务器中,部署了多个 Web 项目,那么在这些 Web 项目中 Cookie 能不能共享?

    1. 默认情况下 Cookie 不能共享
    2. 设置 Cookie 的获取范围
      • void setPath(String path)
        • 默认情况下,设置当前的虚拟目录。所以一个项目中,所有 Cookie 共享
        • 如果要在不同项目中共享,则可以将path设置为 “/”
  2. 不同的 Tomcat 服务器间 Cookie 能不能共享?

    • setDomain(String path):如果设置一级域名相同,那么多个服务器之间 Cookie 可以共享

      如:setDomain(".baidu.com"),那么 tieba.baidu.com 和 news.baidu.com 中 Cookie 可以共享

6. Cookie 的特点和作用

  1. Cookie 的特点
    1. Cookie 存储数据在客户端浏览器(数据不安全)
    2. 浏览器对于单个 Cookie 的大小有限制(4kb)以及对同一个域名下的总 Cookie 数量也有限制(20个)(少量数据)
  2. Cookie 的作用
    1. Cookie 一般用于存储少量的不太敏感的数据
    2. 可以在不登录的情况下,完成服务器对客户端的身份识别

7. 记住上一次访问时间案例

  1. 需求分析

    1. 访问一个 Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
    2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
  2. 概要设计

    在这里插入图片描述

    在服务器中创建一个 Servlet 来判断是否有一个名为 lastTime 的 Cookie

    1. 有:不是第一次访问
      1. 响应数据:欢迎回来,您上次访问时间为:2019-08-19 12:42:22
      2. 写回Cookie:lastTime=2019-08-19 12:42:22
    2. 没有:是第一次访问
      1. 响应数据:您好,欢迎您首次访问
      2. 写回Cookie:lastTime=2019-08-19 12:42:22
  3. 编码实现

    @WebServlet("/CookieTest")
    public class CookieTest extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 设置编码
            response.setContentType("text/html;charset=utf-8");
            // 标志是否有名为 lastTime 的 Cookie
            boolean flag = false;
    
            // 1.获取所有 Cookie,拿到数据
            Cookie[] cookies = request.getCookies();
            // 2.遍历 cookies 数组
            if (cookies != null && cookies.length > 0) {
                for (Cookie cookie : cookies) {
                    // 3.获取 cookies 名称
                    String name = cookie.getName();
                    // 4.如果有名为 lastTime 的 Cookie,不是第一次访问
                    if(name.equals("lastTime")){
                        flag = true;
                        // 响应数据
                        String value = cookie.getValue();
                        // 进行 URL 解码
                        value = URLDecoder.decode(value,"utf-8");
                        response.getWriter().write("欢迎回来,您上次访问时间为:"+value);
    
                        // 写回 Cookie
                        Date date = new Date();
                        // 格式化日期
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        String format = simpleDateFormat.format(date);
                        // 进行 URL 编码
                        format = URLEncoder.encode(format, "utf-8");
                        cookie.setValue(format);
                        // 设置存活时期
                        cookie.setMaxAge(60*60*24*30);
                        response.addCookie(cookie);
                        break;
                    }
                }
            }
            //5.如果没有名为 lastTime 的 Cookie,是第一次访问
            if(cookies == null || cookies.length == 0 || flag == false){
                // 响应数据
                response.getWriter().write("您好,欢迎您首次访问");
    
                // 写回 Cookie
                Date date = new Date();
                // 格式化日期
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String format = simpleDateFormat.format(date);
                // 进行 URL 编码
                format = URLEncoder.encode(format, "utf-8");
                Cookie cookie = new Cookie("lastTime",format);
                // 设置存活时期
                cookie.setMaxAge(60*60*24*30);
                response.addCookie(cookie);
    
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

bm1998

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值