Cookie和Session的对比和总结
Cookie和Session都是来完成一次会话中的多次请求之间的数据共享的
Cookie和Session的区别:
1. 存储位置:
Cookie是将数据存储到了客户端中, Session是将数据存储到了服务器中
2. 安全性:
Cookie是不安全的, Session是安全的
- 为什么说Cookie是不安全的?
- 因为Cookie数据是存储到了客户端的, 所以很可能会被黑客攻击之后从客户端拿到Cookie数据
- 因为使用Cookie实现数据共享的时候前端和后端交互的时候是直接就是Cookie的数据在直接传输, 我们的Cookie传输的时候是直接使用的cookie请求头和set-cookie响应头传输的Cookie中存储的数据
- 为什么说Session是安全的?
- 因为Session的数据是存储到了服务器端的, 而服务器是很难被黑客攻击开的, 所以黑客也就很难拿到存储到服务器端的Session数据
- 因为使用Session实现一次会话之间的数据共享的时候客户端和服务端之间传输Session的时候虽然也是通过Cookie实现的, 但是不管是cookie请求头又或者是set-cookie响应头中其实传输的都是Session对象的唯一标识(也就是创建Session对象的时候的ID属性值), 而不是直接传输的Session对象的数据, 所以即使黑客拦截了我们的请求之后我们的请求中的数据也只是Session ID值
那么有的人就会说: 那么为什么我们的Session对象可以传输Session ID值, 那么我们的Cookie传输数据的时候为什么不传输Cookie ID值?
- 首先我们要明白: Cookie对象和Session对象的首次创建都是在服务器中, 由于Cookie是存储到客户端的, 那么我们的数据是如何从服务器中跑到客户端的? —> 只能是直接通过Http协议传输过去, 所以我们的Cookie就采用了直接使用set-cookie响应头和cookie请求头传输Cookie中的数据, 但是我们的Session则是不一样的, Session是存储到服务器端的, 所以我们的Session对象只需要传输一个能找到此对象的标识给浏览器就可以, 浏览器得到了这个标识之后就可以在同一次会话的下次请求之中将我们上次请求的Session对象的唯一标识传输到服务器中来, 我们的服务器拿到了对应的唯一标识之后就能通过这个唯一标识找到我们的Session对象, 然后就能通过Session域对象获取到上一次请求中的共享数据
3. 数据大小
Cookie的大小因为浏览器的不同而不同, 最大是4kb, Session大小是无限制的
4. 存储时间
Cookie可以长期存储, Session默认30分钟
-
这里我们说的Cookie可以长期存储指的是即使客户段浏览器关闭之后Cookie中的数据可以依然保存在本地(单但是需要通过setMaxAge()方法来设置),这样即使我们关闭了浏览器之后对应的Cookie数据其实还是存储到本地的,所以也就时Cookie数据还是存在的, 那么我们即使关闭了浏览器之后开启了一次新的会话之后由于Cookie还是存在的, 所以下一次请求服务器的时候还是会携带着对应的Cookie到服务器中
-
但是Session则不行, Session对象底层虽然也是通过Cookie来实现的, 但是我们无法获取到Session底层的Cookie, 所以由于我们的Cookie默认是保存到浏览器的内存中的, 所以也就是当浏览器关闭之后Cookie中的数据就会消失, 那么这个时候Cookie中数据消失了, 而Cookie中存储的是SessionID值, 所以这个时候保存的SessionID值就会消失, 那么下一次客户单浏览器请求服务器的时候就会携带一个新的SessionID值去到服务器中, 这个时候服务器中如果使用了req.getSession()方法的话就会新创建一个Session对象, 而不能获取到上一次会话中的请求中的Session对象了
-
但是一定要注意: 此时我们只是获取不到Session对象了, 因为我们拿不到此Session对象的ID值了, 但是这个时候我们这个Session对象还是存在于我们的服务端浏览器的, 只是我们拿不到而已,
-
这个时候就会有新的问题出现: 这个时候当浏览器关闭之后Session对象并没有从服务器中消失, 那么当我们如果有很多Session对象创建之后, 这个时候长期积累下来就有可能会导致服务器内存爆满?
- 是有这个可能的, 但是这个问题在设计的时候就已经被解决了, 解决的方式就是Session对象的超时时间, Session对象的失效时间就是当浏览器多长时间之中没有访问对应Session对象的时候对应Session对象就会被删除掉, Session对象的默认超时时间为30分钟
补充:
- Session对象的超时时长修改
Session对象的超时时间可以通过web.xml文件中使用session-config标签中的session-timeout标签来配置, 这种配置方式是配置之后整个web项目中所有的Session对象默认的超时时间都会改变
还有一种方式就是通过某个Session对象调用SetMaxInactiveInterval(int Interval)方法来设置某个Session对象的超时时长
- 注意: 如果将SetMaxInactiveInterval()方法的参数值设置为负数之后就表示永不超时 ( 很少使用, 因为如果设置为永不超时的Session太多的话就有可能会导致服务器内存爆满)
-
服务器一旦创建Session对象之后, 就会以set-cookie的形式将对应的JSESSIONID的值传输到客户端浏览器中, 一旦浏览器拿到了此JSESSIONID值之后就会在浏览器中创建一个Cookie对象, 创建的Cookie对象中储存的数据就是JSESSIONID值, 那么有了Cookie对象之后每次请求服务器的时候都会携带Cookie去访问对应的服务器
- 注意 : 请求头和响应头中都是通过键值对的形式传输数据
-
一旦某个Session对象我们访问不到的时候我们就说这个Session对象失效了, 但是并不是超时了, 超时是当我们的对应Session对象在对应的超时时间之内没有被访问过, 当到达超时时间之后Session对象就会彻底被销毁
- 注意: 如果我们在Session对象未超时之前访问到该Session对象的时候该Session对象的超时时长会重新开始计时