Cookie技术:客户端的状态管理

会话是啥

举个例子:客户端和服务器之间可能会产生多次的请求和响应,从客户端开始向服务器之间发生请求,中间不管多少次请求响应,直到最后一次客户端访问服务器结束,客户端关闭。这一整个的过程就是一次会话

也就是说,会话将两者之间发出的不同请求联系了起来。

Cookie为什么出现?

我们知道,HTTP本身是无状态协议,不对之前发生过的请求和响应的状态进行管理。

无状态其实是有利有弊的:

  • 利:不必保存状态可以减少服务器的CPU及内存资源的消耗。
  • 弊:某些情况下,用户频繁发出请求,没有状态管理确实也很难受。

如何去解决呢?让服务器去管理状态属实不太现实,毕竟负担太大。但有时后真就出现用户频繁登录频繁访问的情况,这可如何是好?那只能把艰巨的任务交给客户端了,于是,Cookie应运而生。

Cookie技术如何实现

Cookie 实际上是存储在客户端上的文本信息,保留了各种跟踪的信息,用户机制就是用户识别和状态管理。

Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态:

  1. 客户端向服务器发出请求,如果服务器需要记录用户的状态,就在响应中设置Set-Cookie的首部字段信息,通知客户端保存Cookie。
  2. 客户端收到响应之后,如果Cookie有效,则将Cookie进行持久化,即写入对应的Cookie文件中存储。
  3. 浏览器再次访问服务器时,将会自动在请求报文中加入Cookie,告诉服务器,这次我带来了上次你给我发的Cookie。
  4. 服务器收到请求之后,会检查一下这个Cookie,获悉该请求从哪个客户端而来,对比服务器上的记录,得到之前的状态信息
  • Cookie是一门客户端技术,每个客户端将各自保存各自的数据。

  • Cookie功能需要浏览器的支持,如果浏览器不支持Cookie或者Cookie禁用了,Cookie功能就会失效。

在这里插入图片描述

Cookie相关的首部字段

Set-Cookie:是开始状态管理所使用的响应首部字段。

Cookie:服务器接收到的Cookie信息,也是发往服务器的请求首部字段。

Set-Cookie字段的主要属性

NAME=VALUE:Cookie的名称和值,必需。

expires=Date:Cookie的有效期,默认为浏览器关闭为止。

path=PATH:将服务器上的该目录作为Cookie的适用对象,默认为文档所在文件目录。

domain=域名:Cookie对象的适用域名,默认为创建Cookie的服务器域名。

Secure:仅在HTTPS安全通信时才发送Cookie。

HttpOnly:使Cookie不能被Js脚本访问。

有时为了解决xxx等问题,可以利用会话技术解决。

Cookie类的使用

SUN公司将Cookie操作相关的API封装成了Cookie类,我们可以灵活利用Cookie类完成会话跟踪。

1、创建cookie

Cookie cookie = new Cookie("loginTime",s);

注意name和value的值都必须合理,否则需要进行编码。

使用初始名称/值对定义cookie。名称不能包含空格、逗号或分号,只能包含ASCII字母数字字符。

2、发送到浏览器

response.addCookie(cookie);

可以在一次响应中添加多个Cookie。

3、设置最大生命时长

//设置最大生命时长,以秒为单位,这里设置为一天
cookie.setMaxAge(60*60*24);

如果不设置最大生命时长,则默认到浏览器关闭为止

  • 如果值为正数,则浏览器将会对Cookie持久化,时间取决于值的秒数,时间到后自动清除cookie文件。
  • 值为0,表示立即删除cookie。
  • 值为负数,表示该cookie为临时cookie,并不会被持久化,窗口关闭即失效。

4、设置有效路径

//将有效路径设置为web应用的虚拟路径
cookie.setPath(request.getContextPath()+"/");

与path属性相关,用于限制指定cookie的发送范围的文件目录。

如果不指定,默认为只有当前资源的映射路径下有效。

5、获取cookie

Cookie[] cookies = request.getCookies();

返回请求中所有Cookie对象组成的数组,如果没有Cookie,则返回null。

6、杀死cookie

/*杀死cookie*/
//创建名称相同的cookie
Cookie cookie = new Cookie("time","aaa");
//设置相同的path
cookie.setPath(request.getContextPath()+"/");
//设置生命时长为0
cookie.setMaxAge(0);
//发送到浏览器
response.addCookie(cookie);

需要注意的是:一旦服务器将cookie发送到客户端,就没有显式删除cookie的办法。但是可以通过覆盖cookie实现实质性的删除操作:即服务器创建一个MaxAge为0,且除了value之外,其他都必须相同cookie,发往客户端。

但凡有一点不满足,都会创建一个新的同名Cookie,而不是删除原来的。

domain与path

domain:规定哪些域名需要附带Cookie。

  • 不指定domain默认为当前域名,此时子域名就不会附带Cookie。
  • 如果setDomain(".mamll.com"),此时,该一级域名相同的资源都会附带Cookie。

path:指定哪些路径需要附带Cookie。

  • 如果不指定,默认为只有当前资源的映射路径下有效。

  • 如果指定path,则指定路径及其级别下都要附带Cookie。因此,我们可以将有效路径设置为web应用的虚拟路径:cookie.setPath(request.getContextPath()+"/");,这样web应用所有资源都会附带Cookie。

Cookie技术的用途

保存个性化信息:用户的偏好,网页的背景图等。

对话管理:保存登录、购物车等信息。

追踪用户:记录和分析用户的行为。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值