Java Web中的Cookie和Session的理解

一、发展历史

首先简要介绍下它们两个的由来:最开始的时候Web的作用只是文档的浏览,那么服务器就不需要记录每次请求,每一次请求也都是一个新的HTTP,大白话就是服务器和客户端谁都不需要对谁负责的状态。
后续网络购物的兴起使得身份认证成为了必需品。我服务器要知道来访问的人是谁,就给每个人发了一个会话标识(session id),每个人收到的都不一样,向服务器发请求的时候把session id一起发过来,这样服务器就能区分谁是谁了。但是这样就使得服务器的内存爆炸了。
那我们为什么不能让客户端去记录这些信息呢,客户端请求发过来的时候我们验证一下是不是服务器端发的就行了。比如说我对小明的userid做一个加密作为签名,下次小明发送请求的时候把签名一起发过来我再做一次验证不就行了?

二、Cookie

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

cookie由服务器生成,发送给浏览器,浏览器把cookie以 K-V 形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

三、Session

从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

四、Cookie和Session的区别

session是存储服务器端,cookie是存储在客户端,所以session的安全性比cookie高。

获取session里的信息是通过存放在会话cookie里的session id获取的。而session是存放在服务器的内存中里,所以session里的数据不断增加会造成服务器的负担,所以会把很重要的信息存储在session中,而把一些次要东西存储在客户端的cookie里。

cookie确切的说分为两大类:会话cookie和持久化cookie。

会话cookie是存放在客户端浏览器的内存中,他的生命周期和浏览器是一致的,当浏览器关闭会话cookie也就消失了

持久化cookie是存放在客户端硬盘中,持久化cookie的生命周期是我们在设置cookie时候设置的那个保存时间,session的信息是通过sessionid获取的,而sessionid是存放在会话cookie当中的,当浏览器关闭的时候会话cookie消失,所以sessionid也就消失了,但是session的信息还存在服务器端,只是查不到所谓的session但它并不是不存在。所以session在服务器关闭的时候,或者是sessio过期,又或者调用了invalidate(),再或者是session中的某一条数据消失调用session.removeAttribute()方法,session在通过调用session.getsession来创建的。

你可能感兴趣的:(JAVA学习,JavaWeb)