正常登录网站,然后重启浏览器,重新打开网页,发现session id已经变了,但是为什么又能保持登录状态呢? 我看了一些PHP网站可以这样,cnode也是这样,很疑惑这个功能的实现方法 有想过除了session id在cookie中还有其他标志身份的方法,但是这样的话session id存在的意义就没有了
@leapon 没错啊,所以我说很多网站关闭浏览器后,重新打开,session id已经变成一个新的了,新的session id服务器连之前的session都找不到了,但是服务器为什么还是知道你是已经登录的。而如果cookie中有其他标识符帮助服务器识别登录状态和找到之前的session的话,那session id就没什么实际用途了,因为它的用途已经被这个“其他标识符”取代了
我按照你说的试了试,果然有这样的问题,但是我的猜测是这样的,sessionID的生成,应该是有一套专门的加密解密算法,你看到的,应该只是加密之后的sessionID,解析之后有可能根本就没变化,所以之前的cookie存储的信息还是能和现在的session匹配,你的登录状态就不会变(我是菜鸟,说的不对清自动忽略。。。)
cnodejs里有个connect.sid, 这个是一个server端存贮的sessionId,会被存在client,即使关闭browser,下次打开,发送request的时候,也会在cookie里找到,并发送到server, server端检查到这个session expire date后返回登录及相关信息
首先,你要搞清楚sessionId为什么会变? sessionId是由服务端生成的,所以,它变是服务器主动的,即然服务器主动,那当然能关联上变之前的会话了。。。。
你说的场景是“重启浏览器”后sessionId就变了,正常情况下,重启后是不会变的,就算将sessionid的生存周期设为浏览器关掉就失效,它也只会被销毁,而不是变,一般是重启后第二次访问才发现变了(第一次访问会下发新的sessionId)…你如果真的发现重启后第一次就变了,那有可能你不重启它都会变,也就是说有可能设置成每访问一次,服务器都会生成新的sessionId
结论:你描述的现象如果没有错,那有两种可能 1.sessionId每次都会变(服务器会自动关联旧的session内容,登录状态自然能保存) 2.这个sessionID并不是真正用作会话的sessionId(话话标识其它可以任意命名,比如可以叫abc而不叫sessionId,这样的话,无论sessionId怎么变,都不会影响登录),
@CocaCola183 我看过一些生成session id的源代码,只是根据时间生成的一些随机值而已,而且就算他可以根据这个识别,但是重新打开浏览器后,原先生成的session id已经被销毁了,也就是说他并没有session id可以传给服务器,也无从说服务器识别出他是谁
不知道这个是否能帮到你,我又按照你的思路走了一遍,关闭浏览器,打开发送原来的请求,发现此时页面是有cookie
的,我删掉cookie,然后访问,就弹出登录页面,如果不删掉cookie,页面就直接跳转了。至于为什么关闭浏览器,cookie还存在,可能是因为设置了cookie生存时间(具体在哪里设置的我不是很清楚,貌似在服务端可以设置),设置这个之后,cookie就不会在关闭浏览器的时候就消失了。cookie存在,也就可以直接登录的,回到刚开始的问题,sessionID会变化问什么还可以找到对应的信息,我也不是很明白。。。再学习下吧