Cookie学习笔记

三世轮回 提交于 2020-02-03 18:26:39

1、Cookie的实现原理

  Cookie的实现是基于HTTP的响应头set-cookie和请求头Cookie的交互。服务器中将一段特定内容包含在响应消息中,即设置set-cookie响应头,然后客户端根据响应头存储cookie消息。客户端再次向服务器发送请求时会在请求消息中设置请求头cookie,服务器可以根据cookie对客户端进行身份识别,服务器也可以根据需要获取客户端的cookie内容。
在这里插入图片描述

2、WEB后端服务器对Cookie的使用

  • CookieDemo1中发送cookie
    //1、创建Cookie对象,绑定数据
    Cookie cookie = new Cookie(name, value);
    //2、发送Cookie对象
    response.addCookie(cookie);			
    
  • CookieDemo2中获取cookie
    //获取Cookie对象,得到数据
    Cookie[] cookies = request.getCookies();
    //获取键和它对应的值,需要遍历cookies
    if(cookies != null){
    	for(Cookie cookie : cookies0{
    		String name = cookie.getName();  //获取键
    		String value = cookie.getValue();	//获取值
    	}
    }
    

注意点:使用getCookies方法获取的是Cookie对象数组


3、Cookie的细节

  1. 服务器可以一次性发送多个cookie,前提是创建多个Cookie对象并且多次调用addCookie方法。

  2. 客户端浏览器对于单个cookie的数据大小有一定的限制(4kb)。

  3. Cookie的生命周期(Cookie有个属性为max-age,用来表示Cookie的生命周期,可以通过setMaxAge方法设置属性值)

    1、默认情况下当浏览器关闭后,Cookie数据被销毁(max-age : -1)
    2、设置Cookie的存在时间位T秒(max-age:T)
    3、立刻在浏览器中删除Cookie对象数据(max-age:0)

  4. Cookie对象在Tomcat 8版本之后解决了中文乱码的问题,而在Tomcat 8版本之前存储中文数据时会出现乱码。

    1、存储cookie对象的值时:
    String name = URLEncoder.encode( cookieName, "UTF-8 ) ;
    String value = URLEncoder.encode( cookieValue, “UTF-8” ) ;
    Cookie cookie = new Cookie(name , value);
    2、获取cookie对象的值时:
    String name = URLDecoder.decode( cookieName, “UTF-8” ) ;
    String value = URLDecoder.decode( cookieValue, “UTF-8” ) ;

  5. Cookie可以在同一个服务器下部署的多个web项目中实现数据共享。默认情况下cookie数据是不能共享的,但是可以通过setPath方法来设置cookie的使用范围。

    比如一个服务器的根目录为\,服务器下部署了Demo1、Demo2等多个web项目,其中它们的路径分别为\Demo1、\Demo2,所以可以设置setPath("")来实现Demo1和Demo2之间的cookie数据共享。
    在这里插入图片描述

  6. Cookie可以在不同的服务器下实现数据共享。默认情况下cookie数据是不能够共享的,但是可以通过setDomain方法来设置cookie的使用范围。

    比如百度旗下的百度新闻和百度知道分别是在不同的服务器下部署的网站,分别是news.baidu.com和zhidao.baidu.com,其中baidu.com属于一级域名,而news和zhidao属于二级域名(一般表示的是服务器名字),所以可以设置setDomain(".baidu.com")来实现百度新闻和百度知道之间的cookie数据共享。(注意setDomain方法的参数需要以 . 开头)
    在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!