目录
Cookie
Session
分布式下Seesion的不足
Cookie
定义:Cookie是服务器发送到浏览器,并保存在浏览器端的一小块数据。浏览器下次访问该服务器时,会自动携带该数据块,将其发送给服务器。
作用:由于HTTP是无状态的,在同一次连接中,两个执行成功的请求之间是没有关系的,这就带来了问题,用户没办法在同一个网站进行连续的交互。会话技术就是可以解决这个问题,将一次连接中多个请求连接在一起。
具体代码实现
// cookie示例
@RequestMapping(path = "/cookie/set", method = RequestMethod.GET)
@ResponseBody
public String setCookie(HttpServletResponse response) {
// 创建cookie
Cookie cookie = new Cookie("code", CommunityUtil.getUUID());
// 设置cookie生效的范围
cookie.setPath("/community/alpha");
// 设置cookie的生存时间
cookie.setMaxAge(60 * 10);
// 发送cookie
response.addCookie(cookie);
return "set cookie";
}
@RequestMapping(path = "/cookie/get", method = RequestMethod.GET)
@ResponseBody
public String getCookie(@CookieValue("code") String code) {
System.out.println(code);
return "get cookie";
}
【验证】第一步,服务器成功cookie,从responseHeaders中可以看出,已经生成cookie
【第二步】在RequestHeader中携带了cookie信息
Session
是JaveEE的标准,用于在服务器端记录客户端的信息。数据存放在服务端更加安全,但也会增加服务端的内存。
- 浏览器访问服务器时,服务器会生成一个Session信息。
- 服务器产生一个Cookie将SessionId存入Cookie返回浏览器。
- 浏览器再次访问时候带着cookie就可以了
// 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";
}
@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";
}
【验证】创建session
利用Cookie访问Session
分布式下Seesion的不足
- 假设,我们用户A来了访问nginx做负载均衡,首先被分配到了服务器1,服务器1存入session。
- 第二次我用户A又来了,然后分配到了服务器3,服务器3又存入Session。这就造成了。
- 服务器端的压力,重复存入Session。
解决方案:利用Redis+token来缓存。解决用户状态记录的问题