SESSION在服务端(PHP/JAVA)具体是如何实现的?
时间:2021-07-01 10:21:17
帮助过:3人阅读
通常我们说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 的。
答得比较抽象,但正如很多技术问题一样,一个术语要描述清楚需要用到别的术语才能严谨。详细答案可以参考以下链接。
https://en.m.wikipedia.org/wiki/HTTP_cookie
https://en.m.wikipedia.org/wiki/Session_ID
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服务器的逻辑实现方式