cookie
指某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。也就是说如果知道一个用户的cookie,并且在cookie有效的时间内,就可以利用Cookie以这个用户的身份登录这个网站
会话cookie和持久cookie区别
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就小时了,这种生命周期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而保存在内存里。
如果设置了过期时间,浏览器就会把cookie保存在硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口,而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
session
session在不同 环境下的不同含义
session,是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session,然而当session一词语网络协议相关联时,它又往往隐含了“面向连接”和/或“b保持状态”这样两个含义
session在web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务端之间保持状态的解决方案。有时候session也用来指这种解决方案的存储结构。
session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求是否包含一个session标识——称为session id
如果已经包含一个session id则说明以前已经为此用户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不用,可能会新建一个,这种情况可能出现在服务器已经删除了该用户对应的session对象,但用户认为地请求的URL后面附加上一个JSESSION的参数)
如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此相关联的session id,这个session id将在本次响应中返回给客户端保存
cookie机制和session机制区别
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是服务器端保持状态的方案。
cookie、session和sessionId关系
sessionId是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionId和它对应,并返回给浏览器,这个sessionId会被保存在浏览器的会话cookie中,Tomcat生成的sessionID叫做jsessionID。
sessionID在访问Tomcat服务器HTTPServletRequest的getSession(true)的时候创建,Tomcat的managerBase类提供创建sessionId的方法:随机数+时间+jvmid。Tomcat的standardManager类将session存储在内存中,也可以持久化到file、数据库、memcache、redis等。
客户端只保存sessionID到cookie中,而不会保存session,session不会因为浏览器的关闭而删除,只能通过程序调用HTTPSession.incalidate()或超时才能销毁。
session的id从哪里来,sessionId如何使用?
当客户端第一个请求session对象的时候,服务器会为客户端创建一个session,并将通过算法算出一个session的id,用来表示该session对象。
session存放在哪里?
服务器端的内存中,不过session可以通过特殊的方式做持久化管理。(menchacha,redis)
session在下列情况加被删除:
1、程序调用HTTPSession.invalidate()
2、距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
3、服务器进程被停止
注:客户端只保存sessionId到cookie中,而不会保存session
关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效,同样也不会使已经保存到硬盘上的持久化cookie消失。
session cookie和session对象的生命周期是一样的吗?
当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端。
session在何时创建?
一个常见的错误是以为session在有客户端访问时就被创建,然后事实是知道某server端程序调用HTTPServletRequest.getSession(true)这样的语句才会被创建
在创建了session的同时,服务器会为该session生成唯一的session id,而这个session id在随后的请求中会被用来重新获得已经创建的session;在session被创建之后,就可以调用session相关的方法往session中增加内容了,而这些内容智只会保存在服务器中,发给客户端的只有session id,方客户端再次发送请求的时候,会将这个session id带上,服务器接收到请求之后就会根据sessionid找到相应的session,从而再次使用之。
打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session,这样我们的信息共享的目的就达不到了
此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后再新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persstent cookie的结合我们就可以实现了跨窗口的会话跟踪
客户端用cookie保存了sessionId时
客户端用cookie保存了sessionId,当我们请求服务器的时候,会把这个sessionId一起发给服务器,服务器会用到内存中搜索对应的sessionId,如果找到了对应的sessionId,说明我们处于登录状态,有相应的权限,如果没有找到对应的sessionId,这说明,要么是我们把浏览器关掉了,要么session超市了,session被服务器清楚了,则服务器会给你分配一个新的sessionId,你得重新登录并把这个新的sessionId保存在cookie中。
在没有把浏览器关掉的时候(这个时候假如已经把sessionId保存在cookie中了)这个sessionId会一直保存在浏览器中,每次请求的时候都会把这个sessionID提交到服务器,所以服务器认为我们是登录的,当然,如果太长时间没有请求服务器,服务器认为我们已经把浏览器关掉了,这个时候服务器会把该sessionId从内存中清除掉,这个时候如果我们再去请求服务器,sessionId已经不存在了,所以服务器并没有在内存中找到对应的sessionId,所以会再产生一个新的sessionId,这个时候一般我们又要登录一次。
客户端没有用cookie保存sessionId时
这个时候如果我们请求服务器,因为没有提交sessionId上次阿,服务器会认为你是一个全新的请求,服务器会给你分配一个新的sessionId,这就是为什么我们每次打开一个新的浏览器的时候都会产生一个信的sessionId
当我们一旦把浏览器关掉后,再打开浏览器再请求该页面,它会让我们登陆,这是为啥?
我们明明已经登陆了,而且没有超时,sessionId肯定还在服务器上,为啥现在我们又要再登一次呢?这是因为我们关掉浏览器再请求的时候,我们提交的信息没有把刚才的sessionId一起提交到服务器,所以服务器不知道我们是同一个人,所以这时服务器又为我们分配一个新的sessionId。
https://blog.csdn.net/weixin_43625577/article/details/92393581