Cookie和Session学习
产生
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户。
Session产生
session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
典型的场景:购物车
下单时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。
Session是保存在服务端的,有一个唯一标识。
Cookie产生
cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。
为了识别特定的客户,产生了Cookie
每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID。
总结:
session 因为 session id 的存在,通常要借助 cookie 实现,但是布置非要这样获取。
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中; Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
使用场景
Cookie使用场景:
自动登录
Cookie cookie = new Cookie("user", "suntao");
cookie.setMaxAge(7*24*60*60); // 一星期有效
response.addCookie(cookie);
// 因为取得的是整个网页作用域的Cookie的值,所以得到的是个数组
Cookie[] cookies = request.getCookies();
for(int i = 0 ; i < cookies.length ; i++){
String name = cookies[i].getName() ;
String value = cookies[i].getValue() ;
}
Session使用场景
session代表会话,代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续。
session因为请求(request对象)而产生; session是一个容器,可以存放会话过程中的任何对象; session的创建与使用总是在服务端,浏览器从来都没有得到过session对象; session是一种http存储机制,目的是为武装的http提供持久机制。
sessionid存储结构
在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。