Cookie介绍:
服务器发送到浏览器,并保存到浏览器端的一小块数据,大小只有4k,浏览器下次访问服务器的时候,会带着cookie,将其发送给服务器。cookie存储在浏览器,不安全
Session介绍:
在服务端HTTP状态信息的方案。服务端专门开辟一块内存来保存session,默认有效时间为30分钟,每个session都有一个唯一的sessionId,默认保存在cookie中,禁用Cookie就使用url重写,把sessionId加在url路径
当用户发送一个请求到服务器端时,服务器会先检查请求中是否含有sessionid(存在cookie中或者在url中),
1.如果不存在,说明是第一次请求,就会为该请求用户创建一个session对象,并将sessionid放到响应头的set-cookie中,格式set-cookie:sessionid,下次再请求时cookie中就会有一个name为jsessionid的cookie,value就是sessionid。
2.如果存在sessionid,就会在服务器查找是否有该sessionid对应的session,如果有就使用,没有就创建一个。
服务器的session和客户端的cookie是息息相关的,若是没有了cookie,又不做其他处理的话,服务器端的session也没了。
@Controller
@RequestMapping("/alpha")
public class AlphaController {
//cookie示例
@RequestMapping(path = "/cookie/set", method = RequestMethod.GET)
@ResponseBody //返回的不是页面
public String setCookie(HttpServletResponse response) {//cookie存到response里面
//创建cookie,cookie存储的是 一个字符串,并且每一个对象只能存储一个key-value
Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
//设置cookie生效范围。即在哪条路径下有效,此路径及子路径
cookie.setPath("/community/alpha");
//设置生存的时间。默认是会话级别,存在内存,关闭浏览器就死。设置存活时间后会保存到硬盘
cookie.setMaxAge(60 * 10);//10分钟
//发送cookie,添加到response,浏览器响应的时候就带着,在响应标头responseHeaders里
response.addCookie(cookie);
return"我是一个cookie";
}
//测试浏览器第二次访问时,会不会发现上次请求的cookie。cookie在请求标头里
@RequestMapping(path = "/cookie/get", method = RequestMethod.GET)
@ResponseBody
public String getCookie(@CookieValue("code") String c) {//仅获取名为code的cookie,取出来赋值给c
System.out.println(c);
return "我是第二次访问服务器,快查看一下有没有上次访问的cokkie";
}
}
第一次访问,在响应标头里面
第二次访问(注意别超过生存时间),在请求标头里面
//测试session示例
@RequestMapping(path = "/session/set", method = RequestMethod.GET)
@ResponseBody
public String setSession(HttpSession session) {
session.setAttribute("id", 1);
session.setAttribute("name", "Test");
return "我在测试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 "我是来拿session的";
}
服务器生成session,并把sessionId放在cookie中响应给浏览器
浏览器下次访问的时候,会在请求头中带着cookie,cookie存储的是sessionId
分布式部署时,使用session会有问题
1.粘性session:有一个ip来了,分给一个服务器处理,下次相同的ip来访问,还是使用相同的服务器处理,这样就能使用上次的session。但是会有问题,负载不均衡
2.同步session:有一个服务器创建了session,同步给其他的服务器。这样服务器之间会产生关联
3.共享session:用一台服务器专门用来存储session,其他的服务器都向该服务器获取session。但是如果该服务器挂了,就gg
4.存到数据库,所有的服务器都访问数据库redis,得到会话的数据。数据库做一个集群,主从备份,不怕宕机