HTTP协议与cookie(服务器发给客户端来保存的)
- cookie是HTTP协议制定的,先由服务器保存cookie到客户端,在下次请求服务器时把上一次请求到的cookie在归还给服务器
- 由服务器创建保存到客户端浏览器的是一个键值对,服务器保存cookie的响应头;Set-Cookie:aaa=AAA
- 当浏览器再次请求服务器时,会把该服务器保存的cookie随请求发送给服务器,浏览器归还cookie的请求头:Cookie:aaa=AAA;bbb=BBB
- http协议规定
- 一个cookie最大4kb
- 一个服务器最多向一个浏览器保存20个cookie
- 一个浏览器最多可以保存300个cookie
- cookie不安全,可能泄露用户信息,所以浏览器支持禁用Cookie
- 某些浏览器可cookie容量会更大
cookie的用途
- 服务器使用cookie来跟踪客户端状态
- 显示上次用户登录的用户名
javaweb中使用cookie
- 原始方式
- 使用response发送Set-cookie响应头
- 使用request获取cookie请求头
- 便捷方式
- 使用response.addCookie(Cookie)方法向浏览器保存cookie
- 使用request.getCookies()方法获取浏览器归还的cookie
- ==注意,cookie的值不能直接存放中文==
- cookie的值中是不能直接存放中文的,需要使用URLEncoder.encoder(String,String charset)进行编码,才可以响应给客户端
- 同理,服务器获取到的cookie,必须进行URLDecoder.decode(String cookiename,String charset)进行解码
cookie声明周期
- cookie不只有name和value两个属性
- Cookie的setMaxAge(int expiry)设置Cookie的最大生命值,==单位是秒==
- expiry>0:浏览器会吧Cookie保存到==客户端的硬盘==上,到期后这个cookie就不能使用了,但是还是在cookie上,需要我们手动或则清理软件删除
- expiry<0:Cookie==保存在浏览器内存中==存在,当用户关闭浏览器的时候,浏览器进程结束,Cookie也就死亡了
- expiry=0,浏览器会马上删除这个Cookie
Cookie的path
- 默认的path是当前资源所在的路径,比如访问day13下的AServlet,那么默认的路径就是/day13
- Cookie的path并不是设置这个Cookie在客户端的保存路径
- Cookie的path由服务器创建Cookie时设置
- 当浏览器访问服务器时某个路径时,需要归还哪些Cookie給服务器呢?这个由Cookie的path决定
- 浏览器访问服务器的路径如果包含某个Cookie的路径那么就归还这个Cookie
- setPath(“/”)在服务器先所有的项目都可以获取这个cookie
- 例如:
- aCookie:path=/day05; bCookie.path=”/day05/cookie” ;cCookie.path=”/day05/cookie/jsps”
- 访问:http://localhost:8080/day05/index.jsp,归还aCookie
- 访问:http://localhost:8080/day05/cookie/a.jsp,归还bCookie
- 访问:http://localhost:8080/day05/cookie/jsps/b.jsp,归还cCookie
- Cookie的path的默认值:当前访问路径的父目录,也就是当前访问的文件所在的目录
Cookie 的 domain
- domain用来指定cookie二级域名,当多个二级域中共享Cookie是才有用
- 例如:www.baidu.com, tiaba.baidu.com, yinyue.baidu.com
- 设置domain的值 cookie.setDomain(“.baidu.com”)
- 设置path为:cookie.setPath(“/”)
cookie的domain参数详解
- 在任何域名下,cookie的domain参数都只能指定为当前域名或上级域名(包括上级的上级,等等),此外都是无效的。
如:在t.a.b.com下,指定domain为t.a.b.com、a.b.com、b.com都是可行的。 - 在domain的参数前,是否存在符号“.”是完全相同的。
如:domain=a.b.com和domain=.a.b.com是完全相同的。 - 脚本只可访问domain参数设置为当前域名或上级域名(包括上级的上级,等等)的cookie,以及当前域名下设置的没有domain参数的
cookie。 - 如果不指定domain,则cookie无法在其他任何域名下被访问,即使是子域名。
- 指定domain与不指定domain的cookie是不相同的,即使下面的情况所产生的cookie也是不同的:
case1:在a.b.com下,设置无domain参数的cookie。
case2:在a.b.com下,设置domain=a.b.com的cookie。
case1和case2所生成的cookie是完全不同的。