Cookie
Cookie是什么
Cookie是一种能够让Web服务器把少量数据储存到客户端的硬盘或内存里,或是从客户端的硬盘里读取数据的一种技术。
为什么要使用Cookie
因为HTTP协议是一种无状态协议,Http没有保存状态,对每一个请求无法区别每个请求对应的是哪个用户,也无法判定是否是用户已经登录或者是还没登录,所以需要引入一种机制,通过在浏览器中存储一些数据,记录用户的登录状态和保存用户的登录信
息;引入cookie之后,在请求时会把cookie附加到请求头中,这样服务端一读取请求头就知道了这次请求是哪个用户发起的。
什么情况下要使用Cookie
Cookie的使用分为在业务程序中显式使用和通过容器隐式使用。
- 隐式使用: 首次访问JSP、Servlet时,Servlet容器会自动往响应头中添加一个Cookie(Tomcat中是JSESSIONID)
- 显式使用: 当我们有一些安全性要求不高,数据量不大的用户数据需要存储时,可以考虑使用Cookie
怎么使用Cookie?
Cookie的属性

在Chrome浏览器开发者模式中,我们可以看到网站的cookie;
图中可以看到Cookie具有的属性有 Name、value、Domain、path、Expires/Max-Age、Size、HTTP、Secure等。
Name:该Cookie的名称,一旦创建,名称便不可更改
Value:该Cookie的值,如果值为Unicode字符,需要为字符编码
Domain:可以访问到这个Cookie的域名。如果设置为
.google.com,则所有以google.com结尾的域名都可以访问该 Cookie。注意第一个字符必须为.注:
非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成。
顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成。
二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。
顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取。
Path:可以访问到这个Cookie的页面路径。 比如domain是
.goole.com, path是/TestServlet,那么只有/TestServlet路径下的页面可以读取此Cookie。Expires/Max-Age: 该Cookie失效时间,单位秒。Cookie在maxAge秒之后失效。
Size:此Cookie的大小。
HTTP:此cookie的
httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。Secure:设置是否只能通过https来传递此条cookie。
Cookie的创建
1 | // 两种方法 |
Cookie的添加
1 | // 使用响应对象写入浏览器 |
Cookie删除
1 | // Cookie没有delete方法 |
Cookie的修改
1 | // Cookie的修改其实就是覆盖添加 |
获取Cookie中的数据
1 | // 1. 先通过请求对象获取请求中携带的所有Cookie数组 |
Session
Session是什么?
Session和Cookie类似,都是用来存储用户信息的。不同于Cookie的是Session是存储在服务器端。他们两者通过JSESSIONID关联起来。
为什么要用Session?
虽然Cookie已经可以标识出哪个请求是属于哪个用户的。但是不足的是Cookie本身是存储于客户端硬盘上,安全性不高,不适合存储敏感数据,还有Cookie本身能存储的数据很有限(数据大小本身限制、数据类型限制、字符集限制)。而存储在服务端的Session完全没有这些问题。
什么情况下要使用Session?
Session可以用来存储用户的所有信息,理论上所有能在Cookie中存储的数据都可以放到Session中。考虑到Session是基于内存的,如果存储太多不太重要的数据会大大增加服务器端内存压力,一般Session会配合Cookie一起使用。
怎么使用Session?
创建Session
1 | // Session是由容器自动创建的,我们可以在代码中直接获取Sesssion |
往Session中存储数据
1 | session.setAttribute(); |
获取Session中的数据
1 | session.getAttribute(); |
删除Session中的数据
1 | session.removeAttribute(); |
修改Session中的数据
1 | // 修改Session中的数据和修改Cookie中的数据类似,都是覆盖添加 |
强制让Session失效
1 | session.invalidate(); //调用后session对象会失效,同时客户端Cookie中的JSESSIONID也会发生变化 |