初识Cookie
题外话
之前一直以为cookie很神秘,了解的程度也是刚刚入门级别,甚至是说堪堪入门而已,这次为什么写这篇笔记,这得幸于公司项目,在看了登录部分代码之后。所以想趁此机会好好系统性的了解一下cookie,下面是我对于cookie的理解和描述,以及使用方式,最后讲解Cookie类中的方法使用。
1、对cookie的理解
- 什么是cookie?
- cookie是怎么产生的?
- cookie的作用是什么?
什么是cookie?
cookie是服务端校验客户端的凭证。既然cookie是服务端校验客户端的凭证,那么服务器是以什么规范校验的呢?总不可能是客户端提供一个莫名其妙的文本给服务端校验吧?(看第二个问题)
cookie是怎么产生的?
cookie是由服务端产生的,然后响应给客户端的一个类似“键值对”的数据。对,没错,cookie是由服务端产生的,然后相应给客户端的一段文本数据,下次客户端要访问服务端需要携带此cookie。既然客户端要携带这个cookie,可是在我们自己编写的代码中,并没有携带类似cookie之类的东西,这是为什么呢?因为cookie的携带是由浏览器自身来完成的,以及服务端响应给客户端的cookie信息也是有浏览器自身来完成的。
cookie的作用是什么?
其实在第一个问题里已经说明了,cookie就是服务端校验客户端凭证的一段文本数据。
2、cookie的使用方式
- 服务端如何生成cookie?
- 服务端如何把生成的cookie响应给客户端?
- 服务端如何获取客户端请求中的cookie?
服务端如何产生cookie?
Cookie cookie = new Cookie(cookieName,cookieValue);
呐,如上,服务端就很轻松简单的创建了一个cookie了。
服务端如何把生成的cookie响应给客户端?
HttpServeltResponse response;
reponse.addCookie(cookie);
服务端通过HttpServletResponse的addCookie方法,将cookie添加进HttpServletResponse响应给客户端。
服务端如何获取客户端请求中的cookie?
HttpServletRequest request;request.getCookies(); // 获取请求中的所有cookie值返回的是一个cookie数组上面的代码是返回一个cookie[],那么如何获取到已知名称的cookie呢?
举一个我用的方法:
// 将获取到的cookie数组转成以cookie名为key的Map类型,value存的是cookie
public HashMap<String,Cookie> getMapCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
HashMap<String,Cookie> map = new HashMap<>();
if ( cookies != null ){
for(cookie cookie : cookies){
map.put(cooke.getName,cookie);
}
}
return map;
}
// 获取指定name的cookie
HashMap<String,Cookie> cookieMap = getMapCookie(request);
// 对得到的cookieMap判断一下是否存在这个指定名的cookie
if(cookieMap.containsKey("指定的cookieName"){
Cookie cookie = cookieMap.get("指定的cookieName");
}
3、Cookie类里的东西
首先看一下这个类里的一些属性如图,我们可以清晰明了的看见该类的成员变量有好多,我这里只说下我画出来的四个,也是我常用的,其他几个不做记录。
- name
- value
- maxAge
- path
name
该属性是cookie的名字,上面说了,cookie是类似“键值对”的形式,这里的name也相当于键值对中的“key”。
value
该属性是cookie的值。
maxAge
这个讲实话是真的蛮重要的,看上面那张图,默认是-1,还有该值的类型是int。整型,那么有整数,负数,0三种可能。maxAge指的是cookie的存活时间没错,接下来确实是要分三种情况来讲:
-
maxAge > 0
当maxAge > 0的时候,那么该cookie的存活时间就是maxAge s(秒);过了maxAge秒就失效了。在这maxAge秒里,不管是关闭服务端、系统关机、关闭浏览器,cookie一直是存在于客户端的。唯有,只有,仅有 过了这maxAge s 该cookie才"死亡"。该cookie也被称为持久cookie,该cookie会由浏览器保存到磁盘文件上,过期之后再消除。 不同的浏览器保存的cookie文件也是不同的,可以百度了解下。
-
maxAge = 0
当maxAge = 0的时候,那么该cookie设置的时候就已经“死亡”了。
-
maxAge < 0
当maxAge < 0的时候,那么该cookie的存活时间是当前会话,什么是当前会话?我的理解是关闭浏览器之前 访问系统应用的所有请求,就属于一次会话。(网上好多种说法是关闭当前浏览器的tab标签,可是我试了下,关闭当前tab标签,打开一个新的标签页访问服务端,该cookie还是存在的)总之,要想让这种生命周期的cookie失效,可以关闭浏览器,关闭系统以及关闭服务端。该cookie是会话cookie,cookie数据是保存在内存中的。
path
cookie在这个服务端所在的系统哪几个路径下可以访问的到
比如说:cookie.setPath("/");如果该路径是这样设置的,那么在整个服务端的系统里,所有的路径下都能看的到该cookie值再比如说:cookie.setPath("/51/"); // 需要注意的是最后一个一定要是 /如果cookie设置的path是这样的,那么,只有在 http://xxx/51/... 路径下的服务才能看见该cookie的信息。当然还有一种是压根不设这个路径,那默认的path就是设置该cookie的接口所处的controller层类的@RequestMapping指向好吧,这句话有点绕,我举个例子:客户端结果显示:
4、cookie的跨域问题
cookie不能跨域,什么是跨域,比如说,我一个地址映射了两个域名,在1号域名里我已经登录了该系统,假设系统返给客户端cookie信息了,那么你在同一个浏览器去访问2号域名,那么是获取不到刚刚那个cookie信息的。这个可以很方便的在本地上测试。只要将本地的hosts文件修改下,让一个127.0.0.1映射两个模拟域名。
5、如何在客户端查看当前页面的cookie
- 直接在控制台的application这个tab里查看
- 在控制台的console这个tab里敲document.cookie;
6、不能删除、修改
cookie的操作里是没有删除cookie和修改cookie的,删除的话可以用setAge(0)来实现。而修改的话,创建一个name相同,并且path和domain也相同的cookie进行覆盖。