HTTP是简单的HTTP是可扩展的HTTP是无状态的
无状态指的是在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,也就是是指协议对于交互性场景没有记忆能力,每个请求都是新的。举个栗子:当用户在进行网上购物时,通过登录验证了他是否是一个合法用户,然后跳转到了商品页面,可当用户进行购买操作时,服务器忘记了这个用户到底有没有经过验证。然后用户只能在添加商品时还是需要将重新将账号密码以及品信息一起提交给服务器。而使用HTTP的头部扩展,HTTP cookies就可以解决这个问题。把cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。
注意,HTTP本质是无状态的,使用cookies可以创建有状态的会话。 2.cookie简单介绍
cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。cookie 的生命周期可以通过两种方式定义:
会话期 cookie 是最简单的 cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。持久性 cookie 的生命周期取决于过期时间(Expires)或有效期(Max-Age)指定的一段时间
// cookie示例 @GetMapping("/cookie/set") @ResponseBody public String setcookie(HttpServletResponse response){ // 创建cookie cookie cookie = new cookie("code", UUID.randomUUID().toString().replaceAll("-", "")); // 设置生效范围 cookie.setPath("/community/alpha"); // 设置cookie生存时间 cookie.setMaxAge(60 * 10); // 发送cookie response.addcookie(cookie); return "set cookie"; }
@GetMapping("/cookie/get") @ResponseBody public String getcookie(@cookievalue("code") String code){ System.out.println(code); return "get cookie"; }
缺点
数据存到客户端,安全性不能保证由于服务器指定 cookie 后,浏览器的每次请求都会携带 cookie 数据,会带来额外的性能开销 3.session
这里所说的session是为了绕开cookie的各种限制的一种更高级的会话状态实现。是JavaEE标准,用于在服务端记录客户端信息。虽然数据存放在服务端更加安全,但是也会增加服务端的内存压力。用户访问服务器时,服务器会创建一个session对象,然后返回给浏览器一个sessionId,并且把sessionId保存在cookie上,当用户再次访问服务器时,会带着sessionId,服务器就会匹配用户在服务器上的session,根据session中的数据,还原用户上次的浏览状态。
// session示例 @GetMapping("/session/set") @ResponseBody public String setSession(HttpSession session){ session.setAttribute("id", 1); session.setAttribute("name", "Test"); return "set session"; }
@GetMapping("/session/get") @ResponseBody public String getSession(HttpSession session){ System.out.println(session.getAttribute("id")); System.out.println(session.getAttribute("name")); return "get session"; }
粘性session
同步session
共享session