Java Web学习之Cookie和Session的深入理解
作者:YungFan 发布时间:2022-10-28 14:47:10
cookie机制和session机制的区别
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session
机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择
会话cookie和持久cookie的区别
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
日常现象
登录了某个网站,过一会儿再登录,诶,不用输入密码了,直接是登录状态了,好神奇~~~
在某网站看了一部手机,接下来浏览其他网站,旁边的广告全是手机和类似信息,好恐怖~~~
浏览某网站时,提示我是第66666位访问的客户,真的假的?
其实这些都是Cookie和Session在后面作祟,下面就带大家学习学习这两个东东。
Cookie和Session的异同
Cookie与Session都是用来保存用户状态信息的一种方法或者手段;
Cookie是保存在客户端的临时文件夹, Session是保存在服务器的内存中的,服务器使用一种类似于散列表的结构来保存信息,一个Session域对象为一个客户浏览器服务;
Cookie安全性较差,Session安全性较高;
Cookie的保存时间可以很久(以txt格式保存在客户端硬盘),Session保存的时间很短,一般是30分钟;
Cookie为多个客户浏览器共享,Session为一个客户浏览器独享;
Session是通过Cookie的机制来实现的。
两个经典问题与URL重写
1、客户端禁用Cookie,问Session还能工作吗?
不能(事实)绝大多数的网站是这样,原因是没有使用URL重写机制来解决Cookie被禁用的问题。(URL重写代码量大而且只能应用在动态的页面静态的不行)
能(事实)微乎其微的网站可以(比如:卓越),原因是它使用了URL重写机制。
2、 Cookie可以用来实现购物车功能吗?
能,Session能做的Cookie也能做。
** 本质 **
无论Cookie,还是URL重写,目的都是向服务器传递JSESSIONID=32位字符串的key和value名值对。
理解Cookie-Session机制
当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识——称为 Session id,如果已包含一个Session id则说明以前已经为此客户端创建过Session,服务器就按照Session id把这个 Session检索出来使用。如果客户端请求不包含Session id,则为此客户端创建一个Session并且生成一个与此Session相关联的Session id,这个 Session id将在本次响应中返回给客户端保存。客户端保存这个Session id的方式可以采用Cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发回给服务器。一般这个Cookie的名字都是类似于JSESSIONID。对Session来说,除非应用程序通知服务器删除一个Session,否则服务器会一直保留它。浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器不会知道浏览器已经关闭。之所以会有这种错觉,是大部分Session机制都使用会话Cookie来保存Session id,而关闭浏览器后这个 Session id就消失了,再次连接服务器时也就无法找到原来的Session。如果服务器设置的Cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的Session id发送给服务器,则再次打开浏览器仍然能够找到原来的Session。也就实说关闭浏览器不会导致服务器端Session被删除,但是大量的Session一直在也服务器内存,服务器也受不了,所以服务器为Session设置了一个失效时间,当距离客户端上一次使用Session的时间超过这个失效时间(一般为30分钟)时,服务器就可以认为客户端已经停止了活动,才会把Session删除以节省服务器端的存储空间。
来源:https://www.jianshu.com/p/0854743c953d


猜你喜欢
- 一、Rxjava使用场景为了模拟实际场景,从wanandroid网站找了二个接口,如下:(对Wanandroid表示感谢!)public i
- 本文实例讲述了Android编程中自定义dialog用法。分享给大家供大家参考,具体如下:dialog是android中提供的一组弹出提示框
- 一、背景Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE
- FROM子句一、简单FROM子句获取数据源:var queryAllCustomers = &nb
- 前言今天我们来讨论一下,程序中的错误处理。在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避
- 本文实例为大家分享了C#生成验证码图片的具体代码,供大家参考,具体内容如下/// <summary>
- 本文实例为大家分享了Android实现APP秒表功能的具体代码,供大家参考,具体内容如下这几天一直在看安卓,也正好赶上老师布置的作业,所以就
- 导入项目集成环境:IntelliJ IDEA 2020.1.2演示系统:DELL Windows 10Eclipse项目如何导入IDEA并成
- 本文实例为大家分享了C语言实现超市计价收款系统的具体代码,供大家参考,具体内容如下学习一个月的C语言,写了一个简易的超市计价收款系统源码如下
- 本文实例讲述了Java Web实现添加定时任务的方法。分享给大家供大家参考,具体如下:定时任务时间控制类/** * 定时任务时间控制 * *
- MybatisPlus代码生成器含XML所需依赖 <!--Mybatis-Plu
- 最近我要做一个爬虫。这个爬虫需要如下几个步骤:1 填写注册内容(需要邮箱注册)2 过拖拽验证码(geetest)3 注册成功会给邮箱发一封确
- 有经验的开发人员都知道在开发.NET应用时可以利用配置文件保存一些常用并且有可能变化的信息,例如日志文件的保存路径、数据库连接信息等等,这样
- 在微信公众号支付的API中没有这个接口,如果企业需要给用户转账,或者让用户提现或者给用户发红包等需要再商户平台中的产品中心分别开通。一、开通
- 本文实例讲述了C#模式画刷HatchBrush用法。分享给大家供大家参考。具体如下:using System;using System.Co
- 二、简介多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力,但频繁的创建线程的开
- 默认路径在Spring Boot 2.7.2版本中,查看默认静态资源路径,在WebProperties.class中如下private st
- 最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介
- 对于多线程,大家并不陌生,对于如何创建线程也是轻车熟路,对于使用new thread和实现runable接口的方式,不再多说。这篇博文我们介
- Android和iOS开发都支持C++开发,可以一套代码多平台使用。同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一