Cookie 和Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。Cookie一般用来保存用户信息,Session主要作用是通过服务端记录用户的状态
一、工作原理
1、Cookie
(1)浏览器端第一次发送请求到服务器端
(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie
(4)服务器端通过Cookie中携带的数据区分不同的用户
2、Session
(1)Session是基于Cookie实现的。浏览器端第一次发送请求到服务器端,服务器端创建一个Session,为了保证在一个会话的多次请求之间Session是同一个,同时会创建一个特殊的Cookie,其name为JSESSIONID的固定值,value为session对象的ID,然后再将该Cookie发送至浏览器端。
(2)浏览器端发送第二次及以上的请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
(3)服务器端根据name为JSESSIONID的Cookie的value,去查询Session对象,从而区分不同用户。
注:对于第三步(3)
- 如果name为JSESSIONID的Cookie不存在,即发生了关闭或更换浏览器的情况,返回(1)中重新去创建Session与特殊的Cookie
- name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象
- value为SessionId不存在,返回(1)中重新去创建Session与特殊的Cookie
- value为SessionId存在,返回session对象
二、相同点与不同点
1、相同点:
Cookie和Session都是来完成一次内多次请求间的数据共享
2、不同点
- 存储方式:Cookie是将数据存储在客户端,Session将数据存储在服务端
- 安全:Cookie不安全,Session安全
- 存储时间:Cookie可以长期储存,而Session默认储存30分钟
- 数据大小:Cookie最大不超过3KB,而Session没有大小限制
- 对于服务器性能:Cookie不占用服务器资源,Session需占用服务器资源
解释:关于Cookie的缺点,第一,因为Cookie这个数据是存在浏览器上、存在客户端上的,因为客户端是谁我们不知道,且客户端系统的安全程度也远远不如服务器,存在客户端的数据不是很安全,特别是比较隐私的,如密码等。第二,Cookie在很多请求中会把数据发送给服务器,每次访问服务器都发同样的数据,就会增加数据量,会对性能产生一定的影响。为了解决这些问题,引用了Session
三、Cookie和Session的使用
1、Cookie的使用
(1)设置Cookie返回给客户端
//cookie示例
@RequestMapping(path = "cookie/set", method = RequestMethod.GET)
@ResponseBody
public String setCookie(HttpServletResponse response) {
//创建cookie
Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
//设置cookie生效范围
cookie.setPath("community/alpha");
//设置cookie的生存时间
cookie.setMaxAge(60*10);
//发送cookie
response.addCookie(cookie);
return "set cookie";
}
(2)使用Spring框架提供的@CookieValue注解获取Cookie的值
@CookieValue可以将cookie中key的值赋给参数,如下代码,传给了参数code
@RequestMapping(path = "cookie/get", method = RequestMethod.GET)
@ResponseBody
public String getCookie(@CookieValue("code") String code) {
System.out.println(code);
return "get cookie";
}
2、Session的使用
(1)设置Session
创建Session不需要手动创建,它跟cookie不一样,SpringMVC会自动的帮我们创建Session并且注入进来,Session和request、response以及model对象的用法一样,只要声明SpringMVC就会将其注入进来,如下代码声明了(HttpSession session)。
//session示例
@RequestMapping(path = "session/set", method = RequestMethod.GET)
@ResponseBody
public String setSession(HttpSession session) {
session.setAttribute("id",1);
session.setAttribute("name","Test");
return "set session";
}
(2)获取Session
@RequestMapping(path = "session/get", method = RequestMethod.GET)
@ResponseBody
public String getSession(HttpSession session) {
System.out.println(session.getAttribute("id"));
System.out.println(session.getAttribute("name"));
return "get session";
}