JavaWeb阶段Cookie详情介绍

Cookie

会话

会话是在一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方断开为止

会话作用

由于Http是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解,不能共享数据
用于存储浏览器与服务器在请求和响应过程中产生的数据

会话技术

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

Cookie

在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)

使用步骤

  1. 创建Cookie对象
    new Cookie(String name,String value)
  2. 发送Cookie对象
    response.addCookie(Cookie cookie)
  3. 获取Cookie
    Cookie[] request.getCookies()
  4. 遍历数组
    使用for循环遍历,获取每一个Cookie

代码实现

/**
 * @author lifly
 * @date 2021/6/14 0014 9:20
 */
@WebServlet("/setServlet")
public class SetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建cookie对象,设置数据
        Cookie cookie = new Cookie("name", "tom");
        //通过response,响应(返回)cookie
        resp.addCookie(cookie);
        
    }
}
/**
 * @author lifly
 * @date 2021/6/14 0014 9:20
 */
@WebServlet("/getServlet")
public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //通过request对象,接收cookie数组
        Cookie[] cookies = req.getCookies();
        //遍历数组
        if (cookies != null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name+":"+value);
            }
        }
    }
}

服务器发送多个Cookie

 //创建多个cookie对象
        Cookie cookie1 = new Cookie("name", "jack");
        Cookie cookie2 = new Cookie("age", "18");
        //通过response响应多个
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

Cookie在浏览器保存的时间

默认情况下,浏览器关闭Cookie销毁,但是可以设置Cookie的存活时间

相关方法

setMaxAge(int second)设置存活时间,单位:秒
正数:指定存活时间,持久化浏览器的磁盘中,到期后自动销毁
负数:默认浏览器关闭,cookie销毁
零:立即销毁(自杀)

代码演示

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建cookie对象,设置数据
        Cookie cookie = new Cookie("name", "tom");
        //设置cookie存活时间
        cookie.setMaxAge(-1);//浏览器关闭,cookie销毁
        cookie.setMaxAge(60);//存活60秒,到期自动销毁
        cookie.setMaxAge(0);//立即销毁
        //通过response,响应(返回)cookie
        resp.addCookie(cookie);
    }

Cookie存储中文

  1. tomcat8之前
    cookie中不能直接存储中文数据,需要将中文数据转码–一般采用URL编码
    2.tomcat8之后
    cookie支持中文数据,特殊字符还是不支持,建议使用URL编码存储,URL编码解析

相关方法

URLEncoder.encode(String s,String enc);按照指定的编码对s进行URL编码
URLDecoder.decode(String s,String enc);按照指定的编码对s进行URL解码

代码演示

 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取cookies数组
        Cookie[] cookies = req.getCookies();
        //遍历数组
        if (cookies != null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                //对name解码
                URLDecoder.decode(name,"UTF-8");
                System.out.println(name+":"+value);
            }
        }

我安装的tomcat是8.5.59,能存储中文,但是存储的中文中不能有不允许使用 分号、空格、逗号等一些特殊符号…;如果是正常的存储中文的话没有问题,如果是存储特殊符号等机会报错,例如下面代码:

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("product", "nove4");
        String value = "华为p40 华为nove8";
        String encode = URLEncoder.encode(value, "utf-8");
        Cookie cookie1 = new Cookie("pro", value);
        resp.addCookie(cookie);
        resp.addCookie(cookie1);
    }

在存储cookie的时候不会报错,但当我存户cookie1的时候,在浏览器访问的时候会报以下错误

在这里插入图片描述

Cookie的特点与作用

特点

cookie存储数据在客户端浏览器
浏览器对于单个Cookie的大小有限制(4kb)以及对同一个域名下的cookie数量有限制(50个)
浏览器可以存储cookie的总数量为300个

作用

cookie一般用于存储少量的不太敏感的数据
在不登录的情况下,完成服务器对客户端的身份识别

缺陷

  1. 不太安全
  2. cookie存储中文,比较麻烦(编码解码)
  3. cookie的value是String类型的,一个cookie只能存储一个数据,如果需要存储多个数据,就得创建多个cookie
  4. 一个站点对cookie是有限制
    cookie的存储的内容限制在4kb之内
    一台服务器在一个客户端最多保存50个cookie
    一个浏览器最多可以存储300个cookie
  5. 设计问题
    cookie是浏览器与服务器之间数据交互的凭证。如果客户端把cookie给清除掉了,服务器就获取不到数据
    一般来说,我们只会把数据存储到服务器即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值