Cookie详解

本文详细介绍了会话技术和Cookie的概念、使用方法、原理及细节。会话技术用于在多次请求-响应间共享数据,Cookie作为客户端会话技术,通过创建、发送和获取Cookie对象实现数据存储和传递。讲解了Cookie的生命周期、存储限制、中文存储问题以及共享策略。同时,提供了一个实际案例,展示了如何使用Cookie记录用户的最后访问时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一 会话技术

概念

1.1 会话

1.2 一次会话

1.3 功能

1.4 例子

1.5 方式

二 Cookie

2.1 概念

2.2 快速入门

1.创建Cookie对象 绑定数据

2.发送Cookie对象

3.获取Cookie 拿到数据

2.3 原理分析

2.4 Cookie的细节

1.一次可不可以发送多个Cookie?

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

3.Cookie能不能存中文

4.Cookie共享问题;

5.Cookie的特点和作用

6.Cookie案例


一 会话技术

概念

1.1 会话

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

1.2 一次会话

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

1.3 功能

在一次会话的范围内 共享数据 一次会话中包含多次请求-响应 会话技术 可以在多次请求响应间共享数据

1.4 例子

比如购物车一次结算多种商品 每次选择一种商品都是一次请求-响应 多次选择后 一次结算 在多次请求响应之间共享价格等数据

1.5 方式

客户端会话技术 Cookie 数据存储客户端

服务端会话技术:Session数据存储服务器端

二 Cookie

2.1 概念

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

2.2 快速入门

1.创建Cookie对象 绑定数据

2.发送Cookie对象

3.获取Cookie 拿到数据

CookieDemo1

package Cookie;
​
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
​
import java.io.IOException;
​
/**
 * @author shijiu
 */
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建cookie对象
        Cookie c = new Cookie("msg","hello");
        //2.发送cookie给浏览器
        resp.addCookie(c);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

CookieDemo2

package Cookie;
​
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
​
import java.io.IOException;
​
/**
 * @author shijiu
 */
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //3.获取cookie
        Cookie[] cookies = req.getCookies();
        //遍历
        if(cookies!=null){
            for (Cookie c:cookies){
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);//msg:hello
            }
        }
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

2.3 原理分析

客户端浏览器第一次发送请求 请求CookieDemo1的资源  CookieDemo1发送Cookie给浏览器 (真实发送了一个响应头set-cookie:msg=hello)

浏览器会将cookie保存 下一次发送请求时 cookie会被带过去请求头

我们可以通过java的 api来获取发送cookie

2.4 Cookie的细节

1.一次可不可以发送多个Cookie?

可以

//1.创建cookie对象
Cookie c = new Cookie("msg","hello");
Cookie c1 = new Cookie("msg1","hi");
//2.发送cookie给浏览器
resp.addCookie(c);
resp.addCookie(c1);

2.Cookie在浏览器中保存多长时间

  1. 默认情况下 当浏览器被关闭后 Cookie数据被销毁

  2. 持久化存储 setMaxAge(int time)

    1. 正数 将Cookie数据写到硬盘的文件中 持久化存储 Cookie存活时间 如果time=30 说明30s后cookie会被自动删除

    2. 负数 默认值 浏览器内存中 浏览器关闭就没了

    3. :代表删除cookie信息

3.Cookie能不能存中文

  1. tomcat8之前 Cookie中不能存储中文数据

  2. tomcat8之后 Cookie可以存储中文数据 建议使用url编码存储 使用url解码解析 特殊字符 空格等

Cookie c = new Cookie("msg","爱你");

4.Cookie共享问题;

一 同一个服务器中

假设在一个服务器中部署了多个web项目 那么在这些web项目中cookie能不能共享

项目/15 项目 /16 cookie由/16发出存储 /15能不能获取到cookie信息呢 ?

默认访问不到的 不能共享

setPath(String path) 

设置cookie获取的范围 默认情况下 会去设置当前的虚拟目录

如果要共享

c.setPath("/");

二 不同的服务器中

setDomain(String path)

如果设置一级域名相同 那么多个服务器之间cookie可以共享

例子

setDomain(".baidu.com")

那么tieba.baidu.comnews.baidu.com cookie可以共享

5.Cookie的特点和作用

特点

  • Cookie存储数据在客户端浏览器

  • 浏览器对于单个cookie的大小有限制(4kb) 以及 对同一个域名Cookie的数量也有限制 一般最多20个

作用

  • Cookie一般用于存储少量的不太敏感的数据

  • 在不登录的情况下 完成服务器端对客户端的身份识别

在不登录的情况下 修改一些属性 服务器可以通过cookie达到一种识别效果

6.Cookie案例

记住上一次访问时间

需求

  • 访问一个Servlet 如果是第一次访问 则提示 您好 欢迎您首次访问

  • 如果不是第一次访问 则提示 欢迎回来 您上次访问时间为 xxx

Code

package Cookie;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @author shijiu
 */
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应的消息体的数据格式编码
        //服务器默认为ISO编码 浏览器默认解析用GBK编码 所以会乱码
        //设置成utf-8后就相当于告诉浏览器我用的是什么编码 你应该用相同的编码解析 就可以避免乱码
        resp.setContentType("text/html;charset=utf-8");
        //获取所有cookie
        Cookie[] cookies = req.getCookies();
        boolean flag = false;
        // 遍历所有cookie
        if(cookies!= null&&cookies.length>0){
            for (Cookie cookie:cookies) {
                //获取cookie的名称
                String name = cookie.getName();
                //判断名称是否为lastname
                if ("lasttime".equals(name)){
                    flag=true;
                    //如果if判断为true 则不是第一次访问
                    //响应数据
                    String value = cookie.getValue();
                    //打印到屏幕上
                    resp.getWriter().write("欢迎回来您上次的访问时间为"+value);
                    //获取当前时间
                    Date date = new Date();
                    //格式转换成中国时间格式
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
                    String format = simpleDateFormat.format(date);
                    //更新cookie的数据
                    cookie.setValue(format);
                    //返回cookie
                    resp.addCookie(cookie);
                    //设置cookie的存活时间
                    cookie.setMaxAge(60 * 60);

                    break;
                }

            }
        }
        if(cookies==null||cookies.length==0||flag==false){
            System.out.println("第一次访问");
            //第一次访问
            //时间
            Date date = new Date();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
            String format = simpleDateFormat.format(date);
            //创建新cookie
            Cookie lastname = new Cookie("lasttime", format);
            //设置生命周期
            lastname.setMaxAge(100000000);
            //添加cookie
            resp.addCookie(lastname);
            //打印在浏览器上
            resp.getWriter().write("欢迎您首次登陆");
        }

    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

 

人生总有不期而遇的温暖和生生不息的希望。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值