欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

SESSION在服务端(PHP/JAVA)具体是如何实现的?

程序员文章站 2024-04-06 10:30:25
...
通常我们说session可以依托cookie实现,这主要是站在客户端的角度。我想知道在服务端的存储情况。session是存储在内存中,那么在Java/PHP的后台中,一次网页请求(JSP/PHP)其中的网页中的对象/变量的生命周期是怎么样的,SESSION相关对象/变量是如何长时间贮存于内存中,而不销毁的?
PS:web小白

回复内容:

客户端初次请求时,如果会使用到session,此时服务端通过响应头中的Set-Cookie这样一个header项,把sessionId写回到浏览器的cookie中,这种Cookie也叫SessionCookie,在整个浏览器关闭之后就被清除了。而再次请求时,浏览器发送的请求头中会包含cookie这样一项header:即刚才写回来的sessionId,再次到达服务器时,根据这个sessionId,配置之前为请求创建的session,从而所有以这个sessionId保存的信息都存了下来。
服务端这个session默认超时时间是30分钟,就是30分钟没有使用就被清除掉了。而如果一直在使用,则每次active时间会被更新,到了30分也不会被清除。
而至于session存在哪里,只是一种具体的实现形式,比如为了实现session的高可用,可能会把session存到Memcache或者Redis中,甚至存在数据中也是可以的,存取一致即可。 session就分为存储和传递两部分。一般情况下储存是以文件形式存在缓存目录(tmp)中的,可以修改成多种形式,比如memcache储存。传递方面一般都是通过会话生命周期的cookie来传递,当会话结束后cookie就没了,所以就以为session也没了,实际上服务端的session还存在。当然传递还可以改成其他方式,比如做app接口无法使用cookie传递,那么就使用get或post方式来传递session_id,总之了解清楚session原理后,做接口很方便了。 泻药

session cookie 就是 cookie 的一种,cookie 就是存在浏览器里的,服务端不一定需要有对应的存储。

而服务端有存储的 session,一般是指 session id,客户端可以是通过 cookie 维持,也可以通过其他方式维持,服务端根据 session id 映射到用户会话数据,这些数据保存在服务端,传输时只传 session id。

服务端具体怎么存,这就很多种了,有基于文件的,有放在应用内存里的,有存到关系型数据库的,也有存到 NoSQL 的。

答得比较抽象,但正如很多技术问题一样,一个术语要描述清楚需要用到别的术语才能严谨。详细答案可以参考以下链接。

en.m.wikipedia.org/wiki

en.m.wikipedia.org/wiki java中的实现,根据servlet规范,cookie中放一个JSESSIONID
tomcat有一个SessionManager,差不多就是Session session = map.get("JSESSIONID");
然后session有过期机制。
具体看tomcat代码去。 浏览器的php程序目录下有文件保存session信息,文件流也是php默认保存session的方式。而目前类似于百度这样的高并发网站一般都用memcache甚至其他更高科技的手段保存session数据。
服务器端的session用session_id这种类似于数据库外键的东西和客户端cookie里面的PHPSESSION字段做联系。 session 在服务端和浏览器都有储存的内容

类似于银行取钱
浏览器存的叫做session_id 类似于银行卡号
服务器存的就是你的会话信息

当浏览器访问服务器时,会把这个数字带给浏览器。服务器会根据这个数字提取相应的信息,所以说session_id很重要,可能会被不法分子利用
所以有的时候你去支付某些东西的时候,还需在进一步验证。

如果你关闭浏览器,服务端,这些信息也不会丢,只是你下一次打开浏览器,生成session_id和上一次不一样了。

难道这些信息会永久保存吗?
不,这些信息会过期,过期服务端就将这些信息丢弃,所以一段时间后,即使,你一直没关闭浏览器,也要重新登录。就像银行数据库信息丢失,你有卡也没用。

根据服务端的配置不同,这些信息丢失的时间也不同。

上述是java tomcat服务器的逻辑实现方式