Cookie & Session总结

Cookie是什么

Cookie是一种能够让Web服务器把少量数据储存到客户端的硬盘或内存里,或是从客户端的硬盘里读取数据的一种技术。

为什么要使用Cookie

因为HTTP协议是一种无状态协议,Http没有保存状态,对每一个请求无法区别每个请求对应的是哪个用户,也无法判定是否是用户已经登录或者是还没登录,所以需要引入一种机制,通过在浏览器中存储一些数据,记录用户的登录状态和保存用户的登录信

息;引入cookie之后,在请求时会把cookie附加到请求头中,这样服务端一读取请求头就知道了这次请求是哪个用户发起的。

什么情况下要使用Cookie

Cookie的使用分为在业务程序中显式使用和通过容器隐式使用。

  • 隐式使用: 首次访问JSP、Servlet时,Servlet容器会自动往响应头中添加一个Cookie(Tomcat中是JSESSIONID)
  • 显式使用: 当我们有一些安全性要求不高,数据量不大的用户数据需要存储时,可以考虑使用Cookie

怎么使用Cookie?

Cookie的属性

cookie.png

在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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 两种方法
// 1. 构造时将数据传入
Cookie cookie = new Cookie("key", "value");

// 2. 构造时无参,然后通过set方法设置数据
Cookie cookie = new Cookie();
cookie.setName("key");
cookie.setValue("value");

// 除了核心的数据之外,我们还可以设置一些其他属性
// 1. 设置过期时间
cookie.setMaxAge(60); //单位:秒(60秒后,Cookie会自动删除)
// 2. 设置Domain
cookie.setDomain("www.baidu.com"); // 代表只有访问www.baidu.com这个域名下的请求,才能获取到此Cookie
cookie.setDomain(".baidu.com"); // 代表所有www.baidu.com下的二级域名包括www.baidu.com这个一级域名都可以共享此Cookie(注意这种情况下domain必须以"."开头)
// 3. 设置Path
cookie.setPath("/StudentServlet"); // 一旦设置了Path,那么要获取Cookie,当前的请求地址必须满足Path的规则,否则获取不到此Cookie http://xxx:port/student/StudentServlet/getstu/3

Cookie的添加

1
2
// 使用响应对象写入浏览器
reponse.addCookie(cookie); //本质上会在响应中添加一个Set-Cookie响应头。

Cookie删除

1
2
3
4
// Cookie没有delete方法
// 我们可以通过设置过期时间为0实现删除
cookie.setMaxAge(0);
response.addCookie(cookie);

Cookie的修改

1
2
3
4
5
6
// Cookie的修改其实就是覆盖添加

// 具体来说分三步
// 1. 先获取已有Cookie,
// 2. 然后修改其中的数据,
// 3. 最后调用response.addCookie()重新添加到浏览器,浏览器看到Key相同的Cookie会自动更新

获取Cookie中的数据

1
2
3
4
5
6
7
8
9
// 1. 先通过请求对象获取请求中携带的所有Cookie数组
Cookie[] cookies = request.getCookies();

// 2. 迭代Cookie数组,寻找要操作的Cookie
for(Cookie cookie : cookies) {
// 根据cookie.getName()判断是否是自己要获取数据的cookie

// 3. 找到后,调用cookie.getValue()获取数据
}

Session

Session是什么?

Session和Cookie类似,都是用来存储用户信息的。不同于Cookie的是Session是存储在服务器端。他们两者通过JSESSIONID关联起来。

为什么要用Session?

虽然Cookie已经可以标识出哪个请求是属于哪个用户的。但是不足的是Cookie本身是存储于客户端硬盘上,安全性不高,不适合存储敏感数据,还有Cookie本身能存储的数据很有限(数据大小本身限制、数据类型限制、字符集限制)。而存储在服务端的Session完全没有这些问题。

什么情况下要使用Session?

Session可以用来存储用户的所有信息,理论上所有能在Cookie中存储的数据都可以放到Session中。考虑到Session是基于内存的,如果存储太多不太重要的数据会大大增加服务器端内存压力,一般Session会配合Cookie一起使用。

怎么使用Session?

创建Session

1
2
// Session是由容器自动创建的,我们可以在代码中直接获取Sesssion
HttpSession session = request.getSession();

往Session中存储数据

1
session.setAttribute();

获取Session中的数据

1
session.getAttribute();

删除Session中的数据

1
session.removeAttribute();

修改Session中的数据

1
2
3
4
5
6
7
8
9
10
// 修改Session中的数据和修改Cookie中的数据类似,都是覆盖添加

// 1. 获取要修改的数据
Object data = session.getAttribute("key");

// 2. 修改数据对应的属性
data.setXXX();

// 3. 将修改后的数据重新存入Session
session.setAttribute("key", data);

强制让Session失效

1
session.invalidate();	//调用后session对象会失效,同时客户端Cookie中的JSESSIONID也会发生变化