Session到底是保存在客户端还是服务器端?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Session到底是保存在客户端还是服务器端?相关的知识,希望对你有一定的参考价值。

我在登录页面里保存了一个用户ID的Session,跳转到主页后进行检查Session是否为空,为空就跳回去,这是大家常用的小技俩吧?但是
1.书上说Session是保存在服务器端的?不能存在客户端?
2.浏览器关闭后,会释放Session吗?还是会依然保存20分钟?

对于第一个问题,我发现Session用谷歌浏览访问过后,过了3个多小时,还能直接进入页面,并且调试时发现Session依然存在,这说明浏览器把Session也缓存了!存在客户端了!但是为什么在IE和火狐下就显示Session失效了而进不去了呢?

对于第二个问题,我参考了在线人数统计的文章,里面写的很清楚:Session统计在线人数的方法会有误差,因为就算是用户关闭了当前论坛的所有页面,Session也会存活一段时间! 而又有人在网上说:只有关闭当前系统的所有页面,也就是结束了会话,Session就自然清空了,比如网上购物的购物车(Session)。。。。到底谁才是正确的!谁才是误导?!请高人指条明路-_-!

Session存储在服务器的内存中。

浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。它存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,Redis等。

客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。



session机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识——称为session id,如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个)。

如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

以上内容参考 百度百科--session(计算机术语)

参考技术A 我们一般用的Session可以基于Cookies和Cookieless,前者是将身份标识放在Cookies里面,后者是跟在Url里作为get传递的参数..我们普遍用的前者

第1个问题,你赋值一个Session, 此时这个Session对应的值是存在服务器端,客户端无法直接获取这个值的..每个Session对象都有一个SessionID的属性,表明了该Session的唯一性,客户端会生成1个名称为AspNetSessionId(ASP.NET环境下大概是这个,你可以在FireFox的Cookies列表中查看到)的Cookies,和服务器端的SessionID对应,服务器端只有接受到这个Cookies的值才能判断该浏览者对应于哪个Session..所以你第1个问题就回答完了.

第2个问题,过了超时时间才会失效,服务器端永远不会主动去联系客户端看对方是否超时,只是创建Session对象时会有一个过期时间,超过过期时间对应的客户端还没有访问,则会清空Session对象..至于你说的不同浏览器的问题,暂时没遇到过本回答被提问者采纳
参考技术B 1.Session的确是存在于服务器端的
2.一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 session ID。 如果设置了,就按你设置的时间来执行

至于你出现的现象,比较怪,你可以检查一下你自己的代码,有没有设置session周期,个人经验觉得尽可能的设置session周期,以免不同的浏览器解释代码的方法不一样
参考技术C Session的确是存在于服务器端的,在代码编写时可以手动设置Session的释放时间,所以,具体多少是由程序员设置的。
使用Session做用户统计,我觉得一定会有误差,释放时间短了,用户容易过期,长了在线不准确。
像购物车使用cookies我觉得是最好的,它也可以手动设置过期时间,而且是存在于客户端上。不但减少了服务器的压力。而且还可以随用随存,不用就删。
参考技术D Session其实分为客户端Session和服务器端Session。
当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个
SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在
HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个SessionID就是保存在客户端的,属于客户端Session。
其实客户端Session默认是以cookie的形式来存储的,所以当用户禁用了cookie的话,服务器端就得不到SessionID。这时我们可以使用url的方式来存储客户端Session。也就是将SessionID直接写在了url中,当然这种方法不常用。
sessionid如何产生?由谁产生?保存在哪里?
sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。
session在访问tomcat服务器HttpServletRequest的getSession(true)的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;
它存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,Redis等。客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。
session会因为浏览器的关闭而删除吗?
Cookie分为内存中Cookie(也可以说是进程中Cookie)和硬盘中Cookie。大部分的Session机制都使用进程中Cookie来保存Session
id的,关闭浏览器后这个进程也就自动消失了,进程中的Cookie自然就消失了,那么Session
id也跟着消失了,再次连接到服务器时也就无法找到原来的Session了。
当然,我们可以在登陆时点击下次自动登录,比如说CSDN的“记住我一周”,或者我们的购物车信息可以在切换不同浏览器时依然可用。这就要用到我们上文提到的另一种Cookie了——硬盘中Cookie,这时Session
id将长期保存在硬盘上的Cookie中,直到失效为止。

以上是关于Session到底是保存在客户端还是服务器端?的主要内容,如果未能解决你的问题,请参考以下文章

application,session,cookie三者的区别与作用??

web服务端给手机客户端发送一条短信验证码,因为要跟客户端提交的比较,服务端怎么先保存这个验证码呢

session的安全性

session机制

Session ID 是在服务器端还是客户端生成?

gin-session使用以及源码分析