Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie是客户端技术,而HttpSession是服务器端技术。
java中Cookie详细介绍:

Cookie定义

一个小信息,由服务器写给浏览器的,由浏览器来保存。客户端保存的Cookie信息,可以再次带给服务器。
Cookie类所在位置:javax.servlet.http.Cookie

Cookie的属性

  • name:必须的
  • value:必须的
  • comment:可选的。注释
  • path: 可选的,如果不设置路径,那么只有设置该cookie的URI及其子路径可以访问。
    写Cookie的程序的访问路径是:http://localhost:8080/JavaWeb/servlet/CookieDemo。其中:localhost就是域名;/JavaWeb/servlet就是当前Cookie的path。若访问的地址的URI包含着cookie的路径,即URI.startWith(cookie的路径),为true,则客户端将该cookie带给服务器。
  • 比如浏览器存的cookie的路径是/JavaWeb
    现在访问的地址是:http://localhost:8080/JavaWeb/servlet/CookieDemo 则带该cookie
    现在访问的地址是:http://localhost:8080/JavaWeb/CookieDemo 则带该cookie
  • 若浏览器存的cookie的路径是/JavaWeb/servlet/
    访问的地址是:http://localhost:8080/JavaWeb/servlet/CookieDemo 则带该cookie
    访问的地址是:http://localhost:8080/JavaWeb/CookieDemo 则不带该cookie
  • 如果一个cookie的路径设置成了/JavaWeb,意味着浏览器访问当前应用下的所有资源时都会带着该cookie给服务器。
//将映射关系写入cookie中 返回给客户端
	Cookie cookie = new Cookie(COOKI_NAME_TOKEN,token);
	//设置有效期  此处设置为前缀的有效期,可保证同服务器端的session有效期一致
	cookie.setMaxAge(MiaoshaUserKey.token.expireSecond());
	//setPath作用 设置那些路径可以携带该cookie
	//此处标识当前应用下的所有请求都携带这个cookie.
	//当前在请求路径(http://localhost:8080/login/to_login)过程中设置的cookie,
	//登录成功之后跳转到新的页面路径,
	//请求路径(http://localhost:8080/goods/to_list)时,同样携带这个cookie。
	// 因为两者都在设置的路径(http://localhost:8080/)下。
	cookie.setPath("/");
	//返回给客户端
	httpServletResponse.addCookie(cookie);
  • domain:可选的。该Cookie所属的网站域名。(apache.org)默认值。
  • maximum age:可选的。不设置就是会话过程(存在浏览器的内存中)。单位是秒
              如果是0,说明要删除。
  • version:可选的。

向客户端写Cookie:

HttpServletResponse对象.addCookie(javax.servlet.http.Cookie对象)(就是写了一个响应消息头:Set-Cookie:cookie的信息)
Servlet规范中的Cookie API 提供了setMaxAge setPath setDomain等方法,可以对Cookie状态进行控制。
特点:一个浏览器针对一个网站最多存20个Cookie;最多存300个Cookie,每个Cookie的长度不能超过4KB(稀缺)。只是规定,但不同的浏览器实现的不同。

public boolean login(HttpServletResponse httpServletResponse,LoginVo loginVo) { 
		//将映射关系写入cookie中 返回给客户端
		Cookie cookie = new Cookie(COOKI_NAME_TOKEN,token);
		//设置有效期  此处设置为前缀的有效期,可保证同服务器端的session有效期一致
		cookie.setMaxAge(MiaoshaUserKey.token.expireSecond());
		//作用?
		cookie.setPath("/");
		//返回给客户端
		httpServletResponse.addCookie(cookie);
		return true;
	}

服务器获取客户端传来的Cookie:

在Java中利用Serlvet或者JSP scriptlet可以向浏览器端写入Cookie,同样,利用Servet或者JSP scriptlet 也可以读取到 Cookie信息.Servlet规范中的Cookie API 同样存在getMaxAge getPath getDomain等方法,可以获得相应的状态。
不过此处存在一个问题:

读取Cookie时,发现除了Cookie的key和value外,其他值获取都为null。
原因很简单:Cookie从服务器端发送到客户端时,信息是完整的,Cookie从客户器端发送到服务端时,信息只剩下key、value了。(因为Domain不对的Cookie、Path不对的Cookie、过期的Cookie,客户端是不会发送过来的)
那为什么Java中提供了相应的get方法呢? 那个方法其实是在生成Cookie后,尚未发送到客户端时使用的

服务器端通过HttpServletRequest对象.getCookies()可获取cookies数组。

public void login(HttpServletRequest  httpServletRequest, LoginVo loginVo) {
        //获取一组cookie
        Cookie[] cookies = httpServletRequest.getCookies();

        //读取cookie属性
        String name = cookies[0].getName();
        System.out.println(name);
        //读取cookie属性
        String comment = cookies[0].getComment();
        System.out.println(comment);
        //读取cookie属性
        int maxAge = cookies[0].getMaxAge();
        System.out.println(maxAge);
    }

区分Cookie

通过名称不行,应通过domain+path+name来区分的。

参考资料

  • java之Cookie详解