HTTP
- HTTP是简单的
- HTTP是可扩展的
- HTTP是无状态的,有会话的
Cookie
cookie原理
- 是服务器发送到浏览器,并保存在浏览器的一小块数据。
- 浏览器下次访问服务器时,会自动携带该块数据,将其发送给服务器。
// 服务器发送cookie
@RequestMapping(value = "/cookie/set", method = RequestMethod.GET)
@ResponseBody
public String setCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("code", "123456789");
// cookie生效的范围
cookie.setPath("/community/alpha"); //浏览器访问该路径才会向服务器发送cookie
// cookie生存时间 十分钟
cookie.setMaxAge(10 * 60);
response.addCookie(cookie);
return "set cookie";
}
访问 localhost:8080/community/alpha/cookie/set
// 浏览器获得cookie后,再次向服务器请求时发送该cookie
@RequestMapping(value = "/cookie/get", method = RequestMethod.GET)
@ResponseBody
public String getCookie(@CookieValue("code") String code) {
System.out.println(code);
return "get cookie";
}
@RequestMapping(value = "/cookie/getByRequest", method = RequestMethod.GET)
@ResponseBody
public String getCookieByRequest(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie);
System.out.println(cookie.getName()); //code
System.out.println(cookie.getValue()); //123456789
}
return "get cookie";
}
访问community/alpha/下的所有路径都发送cookie
cookie优缺点
- 优点:保存在客户端,减小服务器压力
- 缺点:数据保存在客户端不安全,容易被盗,所以不能存敏感的数据。每次访问服务器都向服务器发送cookie,降低性能。
Session
Session原理
- 是JavaEE的标准,用于服务端记录客户端的信息。
- 本质上也依赖于cookie
// Session示例
@RequestMapping(value = "/session/set", method = RequestMethod.GET)
@ResponseBody
public String setSession(HttpSession session) {
session.setAttribute("id", 23);
session.setAttribute("name", "乔丹");
return "set session";
}
@RequestMapping(value = "/session/get", method = RequestMethod.GET)
@ResponseBody
public String getSession(HttpSession session) {
System.out.println(session.getAttribute("id")); //23
System.out.println(session.getAttribute("name")); //乔丹
return "get session";
}
访问/session/set,服务端返回响应头里带有名为jsessionid的cookie
访问/session/get,浏览器发送的请求头中带有名为jsessionid的cookie
session优缺点
- 优点:cookie只能存字符串类型数据,session能存任意类型数据。数据存放在服务端更安全。
- 缺点:但也会增加服务端的压力。
- 能存在cookie尽量存在cookie,减小服务器的压力。
分布式部署时(多台服务器)使用session
粘性session
-
原理:粘性Session是指将用户锁定到某一个服务器上,用户第一次请求时,负载均衡器(如nginx)将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话,那么用户以后的每次请求都会转发到A服务器上,相当于把用户和A服务器粘到了一块,这就是粘性Session机制。
-
优点:简单,不需要对session做任何处理。
-
缺点:缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的session信息都将失效。同时由于不同用户的请求频率不同,很难对服务器均衡分配。
服务器session复制
- 原理:任何一个服务器上的session发生改变(增删改),该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。
- 优点:可容错,各个服务器间session能够实时响应。
- 缺点:会对网络负荷造成一定压力,如果session量大的话可能会造成网络堵塞,拖慢服务器性能。
session共享机制
- 原理:单独设计一台服务器,专门用来存储session,把所有session存放到该服务器中。
- 优点:可容错,session实时响应。
- 缺点:万一这台服务器挂了,所有session都丢失了。
实际常用的方案
- 原理:能存在cookie的数据就存在cookie,敏感数据存在数据库里,数据库可以做集群备份。