Cookie深入理解

问题

什么是Cookie?Cookie的作用
Cookie的工作机制,即Cookie的运作流程
Cookie的基本属性(4)个以及我们如何使用Cookie

什么是Cookie

        HTTP协议本身是无状态的(无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。)什么是无状态呢,及服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-val键值格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就用response向客户端发送一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再次向网站发送请求时,浏览器会把请求的网址和Cookie一起提交给服务器。服务器检查该Cookie,以此来辨别用户状态。

        类似与我们去银行办理存蓄业务,第一次给你先办张银行卡,里面储存了身份证、密码、手机号码等个人信息。当你下次再来这个银行,银行及其能够直接识别出是你的卡,从而能够直接办理业务。

Cookie机制

当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送经历以下4个步骤:

客户端发送一个请求到服务器–>服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部–>客户端保存Cookie,之后向服务器发送请求时,HTTPRequest请求中会包含一个Cookie头部–>服务器返回相应数据

在这里插入图片描述
在doGet方法中,new了一个Cookie对象并将其加入到HttpResponse对象中

protect void doGet(HTTPServletRequest req,HTTPServletResponsethrows ServletException, IOException{
	Cookie cookie=new Cookie("mcrwayfun",System.currentTimeMillis()+"")
	cookie.setMaxAge(Integer.MAX_VALUE);//设置生命周期为MAX_VALUE
	resp.addCookie(cookie);
}

浏览器输入地址进行访问,结果如图所示:

在这里插入图片描述在Response Headers中包含SetCookie头部,而Request Headers中包含了Cookie头部,name和value正是上述设置的。

Cookie属性项

属性项属性项介绍
NAME=VALUE键值对,可以设置要保存的Key/Value,注意这里的NAME不能和其他属性项的名字一样
Expries过期时间,在设置的某个时间后该Cookie就会失效
Domain生成该Cookie的域名,如domian=“www.baidu.com”
Path该Cookie是在哪个路径下生成,如path=/wp-admin/
Secure如果设置了这个属性,那么只会在SSH连接时才会传回该Cookie

Expries
该属性用来设置Cookie的有效期,Cookie额maxAge用来表示该属性,单位为秒。Cookie中通过该getMaxAge()和setMaxAge(int maxAge)来读写该属性。maxAge有三种3种植,分别为正数,负数和0.

如果该maxAge属性为正数,则表示该Cookie会在maxAge之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中(每个浏览器存储位置不一样)。无论客户关闭浏览器还是电脑,只要还在maxAge秒之前,登录时该Cookie任然有效。下面代码中Cookie信息将永久有效。

 		Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // 设置生命周期为MAX_VALUE,永久有效
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);

当maxAge属性为负数,则表示该Cookie只是一个临时Cookie,不会被持久化,仅在本浏览器窗口或者本窗口打开的子窗口有效,关闭浏览器后该Cookie立即失效。

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // MaxAge为负数,是一个临时Cookie,不会持久化
        cookie.setMaxAge(-1);
        resp.addCookie(cookie);

当maxAge被设置为0时,表示立即删除Cookie

        Cookie[] cookies = req.getCookies();
        Cookie cookie = null;

        // get Cookie
        for (Cookie ck : cookies) {

            if ("mcrwayfun".equals(ck.getName())) {
                cookie = ck;
                break;
            }
        }

        if (null != cookie) {
            // 删除一个cookie
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
        }

修改或者删除Cookie

HTTPServletResponse提供的Cookie操作只有一个addCookie(Cookie cookie),所以想要修改Cookie只能使用一个同名的Cookie来覆盖原先的Cookie。如果要删除某个Cookie,则只需要新建一个同名的Cookie,并将maxAge设置为
0,并覆盖原来的Cookie即可。

新建的Cookie,除了value、maxAge之外的属性,比如name、path、domain都必须与原来的一致才能达到修改或者删除的效果。否则,浏览器将视为两个不同的Cookie不予覆盖

值的注意的是,从客户端读取Cookie,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie只会提交name和value属性,maxAge属性只被浏览器用来判断Cookie是否过期,而不能用服务端来判断。
在这里插入图片描述

我们无法在服务端通过cookie.getMaxAge()来判断cookie是否过期,maxAge只是一个只读属性,值永远为-1.
当cookie过期时,浏览器在与后台交互时会自动筛选过期的cookie,过期了的cookie就不会被携带了。

Cookie的域名

Cookie是不可以跨域名的,隐私安全机制禁止网站非法获取其他网站的Cookie

正常情况下,同一个一级域名名下的两个二级域名也不能交互使用Cookie,比如test1.mcrwayfun.com和test2.mcrwayfun.com,因为两者的域名不完全相同。如果想要mcrwayfun.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数为.mcrwayfun.com,这样使用test1.mcrwayfun.com和test2.mcrwayfun.com就能访问同一个Cookie

一级域名又称为顶级域名,一般由字符串+后缀租出,属性的一级域名有baidu.com,qq.com。com、cn、net等均是常见的后缀
二级域名是在一级域名下衍生的,比如有个一级域名名为mcrfun.com,
则blog.mcrfun.com和www.mcrfun.com均是其衍生出来的二级域名。

Cookie的路径

path属性决定允许访问Cookie的路径。比如,设置为"/表示允许所有路径都可以使用Cookie"

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值