Cookie细谈——让你从精神百倍到聊出瞌睡

文章目录



前言

本次文章主要是记录关于JavaWeb开发中对于Cookie的了解,其可以用于在各种电商平台类项目中的购物车实现中使用以及网页平台中用户登录信息的保存等等。


一、什么是状态管理?

1.1 现有问题的出现

老规矩不管是接触什么样的知识都是从一个“是什么”开始讲解(ps:不然我不好开头,另外给我端杯茶来润润喉~~ ^ _^)

正文:谈起Cookie我们作为一个开发者就不得不先讲讲网络中的“状态管理”这个概念。所谓“状态管理”就是指将浏览器(客户端)与web服务器(服务端)之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据交流或改变就是所谓的“状态”,而对于这些状态的管理我们就称之为“状态管理”。这一概念的起源来自于一些现有问题的出现。

  • 1、HTTP协议是无状态的,因此并不能保存每次我们提交的数据信息。
  • 2、如果一个用户在使用浏览器的时候多次提交请求,那么面对新的请求对于服务器而言就无法知道它是否与上次的请求存在着什么样的联系。
  • 3、对于一些繁琐的操作如果需要进行多次的提交(例如:登录)就成一种麻烦了,每次要进入一个网站时都需要输入一次登录验证这样就显得很麻烦。
    综上而言便有了我们所谓的“状态管理”的出现。

咳咳~ 别打瞌睡,认真记笔记,下课我要检查~~

为了防止困乏,我们就请一个小姐姐来一起陪伴学习(听说点赞她今晚陪你通宵补课

1.2 状态管理的分类

  • 如果是站在客户端管理方面:将状态保存在客户端,代表性就是我们今天要讲的Cookie技术了,即在浏览器的操作中保存。
  • 如果是站在服务器状态管理方面:将状态保存在服务器中,代表技术就是我后面要给大家分享的Session技术(服务器传递sessionID时需要使用cookie的方式)以及application(目前不讲了解即可)。

二、Cookie的使用

2.1 什么是Cookie

  • Cookie是在浏览器访问Web服务器的某个资源的时候,由Web服务器在HTTP响应消息头(即响应报文中的 Response Headers)中附带传给浏览器的一小段数据。
  • 一旦Web浏览器保存了某个Cookie,那么他在以后每次访问该Web服务器时,都应该在HTTP请求同种将这个Cookie回传给Web服务器,以便于后续需要对浏览器的继续操作。
  • 一个Cookie主要由标识该信息的名称(name)和 值(value)组成,也就是 我们经常遇到的 “键值对”。

2.2 Cookie原理的介绍

说明:这图是我借老师课件上的一个插图,*BUT!!*之前那个小姐姐不是哦~~。
在这里插入图片描述

2.3 实战部分,Cookie的那些骚操作

@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建Cookie
        //方法: Cookie cookie = new Cookie(key,value);
        Cookie cookie=new Cookie("cookie01","yongzhong");
        //设置Cookie的访问路径
        cookie.setPath("/CookieServlet_war_exploded/get");
        //设置Cookie的有效期(以一个小时为例)
        cookie.setMaxAge(60*60);//有三种取值方式  1、>0有效期单位秒  2、=0浏览器关闭 3、<0内存存储默认为-1
        //添加Cookie并响应给客户端(即前端)
        resp.addCookie(cookie);
        System.out.println("cookie添加完毕!");
    }
}

结果展示
在这里插入图片描述
再来创建获取所有Cookie的方法,由于Cookie存储在浏览器中并不止一个,故此呢肯定是用一个数组来进行接收撒。

@WebServlet("/getCookieServlet")
public class getCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取全部的Cookie
        Cookie[] cookies = req.getCookies();
        if (cookies!=null){
            for (Cookie c:cookies) {
                System.out.println("获取到的CookieName:"+URLDecoder.decode(c.getName(),"UTF-8")+":"+URLDecoder.decode(c.getValue(),"UTF-8"));
            }
        }else{
            System.out.println("cookie已经存在");
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

接下来就是修改Cookie了,修改Cookie的语法和创建Cookie一模一样,而修改的实质呢就是用一个“同键不同值”的Cookie进行原Cookie值的一个覆盖。

//创建Cookie
Cookie ck=new Cookie("code",code);
  ck.setPath("/webs");//设置你想设置的路径不需要和我一样
  ck.setMaxAge(-1);//设置为内存存储,三种取值方式:>0的值 就是设置过期时间如设置为60即为1分钟 ;=0    则Cookie失效;<0则为内存存储长期存在
response.addCookie(ck);//让浏览器添加Cookie

2.4 Cookie的编码与解码

由于Cookie默认不支持中文,故此只能包含Asclll字符,所以Cookie需要对Unicode字符进行一个编码操作,否则当你使用中文的Cookie传值的时候接收到的结果将会乱码。

  • 编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法
  • 解码使用java.net.URLDecoder类的decode(String str,String encoding)方法

案例如下:

编码操作

@WebServlet("/cookieServlet")
public class cookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8"));
        cookie.setPath("/CookieServlet_war_exploded/get");
        cookie.setMaxAge(600);
        response.addCookie(cookie);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

解码操作

@WebServlet("/getCookieServlet")
public class getCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取全部的Cookie
        Cookie[] cookies = req.getCookies();
        if (cookies!=null){
            for (Cookie c:cookies) {
                System.out.println("获取到的CookieName:"+URLDecoder.decode(c.getName(),"UTF-8")+":"+URLDecoder.decode(c.getValue(),"UTF-8"));
            }
        }else{
            System.out.println("cookie已经存在");
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2.5 Cookie的优缺点

优点:

1、可配置到期规则
2、简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对
3、数据持戒心:Cookie默认在过期之前是可以一直存在客户端的浏览器上

缺点:

1、大小受到限制:大多数浏览器对Cookie的大小只有4K、8K的字节限制
2、用户可以手动配置禁用Cookie(例如谷歌浏览器),这样就会使得Cookie的使用受到限制。
3、有潜在的风险,有些黑客可以利用潜在的安全风险篡改你的Cookie从而获得你的网站小秘密,对安全性或依赖于Cookie的应用程序失效。


总结

文章总结完毕,Cookie知识如上 ,今天到此结束感谢浏览。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sugar-free->小粽子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值