http本身无状态,说白了就是不保存任何用户信息。 所以引入cookie(客户端方案)、session(服务端方案)来保存用户信息:
这些信息通常包括什么,不能包括什么呢?
: 1. 身份信息、登陆状态 2. 用户的个性配置、权限列表 3. 其他的一些通用数据(比如购物车)4 登录凭证, 权限 ?
: session不适合保存比较多的信息,防止服务端压力过大。
: 一般只存ID
: 密码不宜放进session。 private transient String password; 且分布式项目的缘故。
session相关信息:
1 失效只能是超时或者invalidate(); 关闭浏览器不会删除服务端的session,但是可能会删除cookie保存 的sessionId。
2 session实现的‘记住我’并不安全。https://coolshell.cn/articles/5353.html。 记住我相当于自动查数据库。
至于token为什么比sessionId安全,CSRF攻击的方式:被骗去点了个链接,被恶意的JS提交的等
3 一般都是用redis模拟session。
例子
当我们去医院就诊时,医院都会给就诊病人发放就医卡,卡上只有卡号,而没有其它信息。但病人每次去该医院就诊时,只要出示就医卡,医务人员便可根据卡号查询到病人的就诊信息。Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就医卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
为了大家更好的理解Session,接下来,以网站购物为例,通过一张图来描述Session保存用户信息的原理,具体如图1所示。
在图1中,用户甲和乙都调用buyServlet将商品添加到购物车,调用payServlet进行商品结算。由于甲和乙购买商品的过程类似,在此,以用户甲为例进行详细说明。当用户甲访问购物网站时,服务器为甲创建了一个Session对象(相当于购物车)。当甲将Nokia手机添加到购物车时,Nokia手机的信息便存放到了Session对象中。同时,服务器将Session对象的ID属性以Cookie (Set-Cookie: JsessionID=111)的形式返回给甲的浏览器。当甲完成购物进行结账时,需要向服务器发送结账请求,这时,浏览器自动在请求消息头中将Cookie (Cookie: JsessionID=111)信息回送给服务器,服务器根据ID属性找到为用户甲所创建的Session对象,并将Session对象中所存放的Nokia手机信息取出进行结算。