
我们知道一个完整的请求流程包括请求/响应两个过程:
第一步 PC 端发送请求,通过请求行、请求头和请求体来发送详细的请求;第二步服务器收到对请求进行处理,根据请求的具体内容来响应。在这样的 PC 端和服务端对话中,服务器想要管理会话,需要解决以下两个问题:
1 如何标识不同的 PC ?
2 如何标识服务端的不同请求?
问题 1 是为了识别客户端。假如为会话的客户端定义了 ID 身份标识,那么服务器就能对该客户端进行个性化服务。这就像一个人去一家新的理发厅理发,那么理发厅开始时只能按照对待新人的既定流程提供服务:比如 “极力的推荐办卡”、“询问你喜欢哪种发型” 等。但是如果你成为了该理发店的 VIP ,拥有了会员卡 (有了身份标识),那么该理发店就能根据对你的服务记录来提供服务,比如推荐你喜欢的发型、询问你对上次理发的感受等。
实际网络请求中解决的方式和上面的流程很相似,通过 cookie 来作为标识客户端的 ID 。第一次网络请求会话过程中,服务器端定义标识客户端的 cookie ,返回给客户端并存放在客户端的缓存中。客户端再次发送请求时,会把自身的 cookie 传递给服务器,被服务器识别后就能定制化提供响应。比如我们浏览论坛时常常看到的上一次浏览时间、还有在购物网站看到的历史浏览记录等,都是基于 cookie 来实现。下面是通过 google 开发者工具在访问时生成的 cookie :
cookie 具有以下特点:
1 具有有效期, 就像理发卡里面的余额,过期就失效了;
2 同一个请求也可以设置多个 cookie ,类似一个人可以在一家理发店办理
多个 VIP,来享受不同的服务类型;
3 同一个 PC 端可以有不同的 cookie,来对应不同的服务器;
问题 2 中服务端通过 session 来实现区别不同的网络请求。就像一个人去理发店后,店长(服务器)安排一个理发师(网络请求)来为他服务。所以 session 和 cookie 一一对应,二者都是有服务端创建、定义。不同的是 session 存放在服务端,而 cookie 由服务端创建后存储在客户端,使用 session 同样能达到 cookie 实现的效果。存放在
服务端的 session 能够避免信息存储在客户端后被用户手动清除的问题,但是从另一方面来说,也增加了服务端的存储压力。
综上,cookie / session 是一个网络请求中相互对应的标识符。cookie 用在客户端,session 存储在服务端。利用 cookie / session 服务端能实现对一个网络请求的定制响应。
可以利用 IDEA 来模拟一个 PC 端网页请求/响应的流程。需要以下环境:
1 Tomcat 服务器;
2 以 Java Servlet 作为后台服务程序;
3 IntelliJ IDEA 作为 IDE ;
如果不知道如何用 IntelliJ IDEA 配置 Tomcat 和 Java Servlet ,请参考我的上篇文章: 基于 IntelliJ IDEA 模拟 Servlet 网络请求session是存储在服务器端的,cookie是存储在客户端的,所以session的安全性要高于cookie。
再者,我们获取的session里的信息是通过存放在会话cookie里的sessionId获取的。
因为session是存放在服务器里的,所以session里的东西不断增加会增加服务器的负担,我们会把一些重要的东西放在session里,不太重要的放在客户端cookie里。
cookie分为两大类,一个是会话cookie和持久化cookie,他们的生命周期和浏览器是一致的,浏览器关了会话cooki也就消失了,而持久化会存储在客户端硬盘中。分布式Session一致性说白了就是服务器集群Session共享的问题。
Session是服务器用来保存用户 *** 作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session共享会出现请求落到不同机器要重复登录的情况。
假设第一次访问服务A生成一个sessionid并且存入cookie中,第二次却访问服务B客户端会在cookie中读取sessionid加入到请求头中。如果在服务B通过sessionid没有找到对应的数据,那么它创建一个新的并且将sessionid返回给客户端,这样并不能共享我们的Session无法达到我们想要的目的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)