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,不同的浏览器有不同的处理方式。

Java Web学习之Cookie和Session的深入理解

日常现象

登录了某个网站,过一会儿再登录,诶,不用输入密码了,直接是登录状态了,好神奇~~~

在某网站看了一部手机,接下来浏览其他网站,旁边的广告全是手机和类似信息,好恐怖~~~

浏览某网站时,提示我是第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

标签:javaweb,session,cookie
0
投稿

猜你喜欢

  • C# 中闭包(Closure)详解

    2022-12-29 20:36:10
  • Kotlin Flow常见场景下的使用实例

    2023-01-30 10:46:25
  • C# 如何在MVC3中取消备用控制器的选择

    2023-02-16 06:48:18
  • C#实现农历日历的方法

    2022-08-17 21:27:29
  • JavaMailSender实现邮箱验证功能

    2022-05-11 12:32:59
  • Android实现左滑退出Activity的完美封装

    2023-09-19 21:11:59
  • SpringMVC文件上传原理及实现过程解析

    2021-09-03 00:24:25
  • Jenkins一键打包部署SpringBoot应用的方法步骤

    2021-10-31 18:00:53
  • spring依赖注入知识点分享

    2023-11-26 15:32:32
  • 详解Mybatis中常用的约束文件

    2023-11-28 08:02:17
  • Spring Bean实例的创建及构造器的挑选

    2021-08-02 09:35:57
  • Android中Activity的四种启动模式和onNewIntent()

    2022-09-05 23:15:02
  • C++容器适配与栈的实现及dequeque和优先级详解

    2023-11-02 12:57:52
  • android实现录屏功能

    2022-04-18 05:11:22
  • 使用Spring Cache设置缓存条件操作

    2023-01-25 16:38:06
  • C语言实现自定义扫雷游戏(递归版)

    2023-11-03 02:12:36
  • Mybatis步骤分解实现一个增删改查程序

    2021-09-16 01:12:43
  • 如何在MyBatis中实现DataSource

    2021-11-29 13:49:48
  • Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常

    2022-05-06 18:32:06
  • Android ListView自动生成列表条目的实例

    2023-04-21 17:08:09
  • asp之家 软件编程 m.aspxhome.com