根据实验个人理解的cookie处理机制。
首先明确一个事情,浏览器在请求头中传给服务器的cookie信息只有键值对,没有域,路径,过期时间的信息。因为无论在一个cookie中怎么设置这些信息,当从request对象中获得该cookie时,通过相应的get方法,获取到的域,路径,都为空,过期时间为默认的-1(而且从浏览器端的开发者工具也可以直接看出来)。当你设置了域,路径,过期时间等信息的时候,服务器通过响应头信息传给浏览器,浏览器拿到cookie时是有对应的信息的(可以通过浏览器的开发者工具查看),并根据这些信息处理cookie,这些信息相当于是解释说明cookie的作用。换句话说,cookie的主体就是一个键值对[key = value],其它的只是解释说明该键值对的一些附加信息,只是告诉浏览器该怎么处理该cookie的信息。举个例子,当你通过构造方法new Cookie(“testName”, “testValue”),你就创建了一个key为testName,value为testValue的cookie,其它信息你可以不设置,当浏览器收到该cookie时以默认的方式处理它。当你设置了其它信息时,只是告诉浏览以其它方式处理该cookie,而不是该cookie包含了这些信息。例如,当你通过cookie.setMaxAge(0)设置该cookie,根据API解释,就是要删除该cookie,其实说得准确点,是告诉浏览器删除该cookie,而不是设置完后该cookie就被销毁了。也就是说,当服务器执行到该行代码以后,cookie仍然存在,而必须当服务器在响应消息中告诉浏览器后,浏览器执行删除操作,该cookie才会被删除,所以,必须有response.addCookie()操作,将有效时间已经被设为0这个信息告诉浏览器,cookie才会被删除。同样道理,如果某个cookie设置了path,你想删除cookie,你就必须先设置path,告诉浏览器删除哪个path下的cookie,并将对应的cookie响应给浏览器。否则,没设置的情况下,浏览器就在默认的path下去删除cookie,但是,默认path下其实就没有你想删除的cookie,导致cookie无法删除的假象。
对于域也是同样的情况,不过,由于个人实验时没有域名,关于域的方法未经测试,不过,按照前面的实验可以推理。如果某个cookie设置了是针对某个域起作用,同样在删除的时候需要先设置域,告诉浏览器去删除哪个域下的cookie;
(其实仔细想想就明白,cookie是存在于客户端的,无论服务器端怎么处理,在响应给客户端前,不可能能处理到客户端的内容。)