Cookie应用笔记

Cookie是什么?

基本概念:

  1. 网页之间的交互是通过HTTP协议传输数据的,而Http协议是无状态的协议。无状态的协议是什么意思呢?一旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接。
  2. 服务器无法确认用户的信息,于是W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie

Cookie的流程:

浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器。

Cookie常用API

public Cookie(String name,String value);//创建一个cookie
public void setValue(String newValue);//设置cookie的值
public String getValue();//获取cookie的值
public void setMaxAge(int expiry);//设置cookie的时效性
public int getMaxAge();//获取cookie的时效性
public String getName();//获取cookie的属性名
public void setDomain(String pattern);//设置cookie域名(跨域共享cookie)
public String getDomain();//获取cookie域名
public void setPath(String uri);//设置cookie应用url,其他路径获取不到
public String getPath();//获取cookie应用url

简单使用Cookie

创建Cookie对象,发送Cookie给浏览器

//设置response响应编码
response.setContentType("text/html;charset=UTF-8");
//创建Cookie对象
Cookie cookie = new Cookie("username","ww");
//设置Cookie的时间(必须设置,否则不会保存在本地磁盘)
cookie.setMaxAge(1000);	//默认-1,属于临时cookie
//向浏览器给一个Cookie
response.addCookie(cookie);
//访问请求,在网页上打印String提示
response.getWriter().write("已发送一个cookie到浏览器");

Cookie不可跨域名性

  1. 很多人在初学的时候可能有一个疑问:在访问Servlet的时候浏览器是不是把所有的Cookie都带过去给服务器,会不会修改了别的网站的Cookie
  2. 答案是否定的。Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。

Cookie保存中文

//设置response响应编码
response.setContentType("text/html;charset=UTF-8");
//创建Cookie对象
Cookie cookie = new Cookie("username","小明");
//设置Cookie的时间(必须设置,否则不会保存在本地磁盘)
cookie.setMaxAge(1000);	//默认-1,属于临时cookie
//向浏览器给一个Cookie
response.addCookie(cookie);
//访问请求,在网页上打印String提示
response.getWriter().write("已发送一个cookie到浏览器");

访问的结果就是会出现500错误
原因:

中文属于Unicode字符,英文属于ASCII字符,中文占4个字符或者3个字符,英文占2个字符。

解决方案:

Cookie使用Unicode字符时需要对Unicode字符进行编码。

Cookie cookie = new Cookie("username",URLEncoder.encode("小明","UTF-8"));

Cookie保存在硬盘的中文数据是经过编码的,那么我们在取出Cookie的时候要对中文数据进行解码

String username = URLDecoder.decode(cookie.getValue(),"UTF-8");

Cookie的有效期

  1. 如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】
  2. 如果MaxAge为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。如果我没设置Cookie的有效期,在硬盘中就找不到对应的文件。
  3. 如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie

Cookie的修改和删除

Cookie机制没有提供删除Cookie的方法,和修改Cookie的方法
(Cookie类似Map)

1:Cookie的名称相同,会覆盖原来的Cookie的value,可通过此方法来更改Cookie的值。
2:通过setMavAge(0)来删除Cookie

================================================
注意:删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!

================================================

Cookie的domain属性使用

Cookie的domain属性决定运行访问Cookie的域名。domain的值规定为“.域名”

  1. Cookie的隐私安全机制决定Cookie是不可跨域名的。也就是说www.baidu.com和www.google.com之间的Cookie是互不交接的。即使是同一级域名,不同二级域名也不能交接,也就是说:www.goole.com和www.image.goole.com的Cookie也不能访问

现在我希望一级域名相同的网页Cookie之间可以相互访问。也就是说www.image.test.com可以获取到www.test.com的Cookie就需要使用到domain方法。

//设置response响应编码
response.setContentType("text/html;charset=UTF-8");
//创建Cookie对象
Cookie cookie = new Cookie("username","ww");
//设置Cookie的时间(必须设置,否则不会保存在本地磁盘)
cookie.setMaxAge(1000);	//默认-1,属于临时cookie
//==============设置domain===================== 
cookie.setDomain(".test.com");
//=============================================
//向浏览器给一个Cookie
response.addCookie(cookie);
//访问请求,在网页上打印String提示
response.getWriter().write("已发送一个cookie到浏览器");

这样设置,www.test.com发送一个cookie,www.image.test.com就能获取到对应的cookie(实现跨域共享cookie)

Cookie的path属性使用

Cookie的path属性决定允许访问Cookie的路径

  1. 一般地,Cookie发布出来,整个网页的资源都可以使用。现在我只想path1可以获取到Cookie,其他的资源不能获取,只需要cookie.setPath("/path1");,只要不是访问/path1就不能获取到这个cookie

Cookie的安全属性

  1. HTTP协议不仅仅是无状态的,而且是不安全的!如果不希望Cookie在非安全协议中传输,可以设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie。
  2. 当然了,设置secure属性不会将Cookie的内容加密。如果想要保证安全,最好使用md5算法加密
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值