‘/:user’ 是用户界面 ’/‘是主界面 ‘/login’是登入界面 ‘/reg’是注册界面 用户界面从注册界面或者登入界面通过res,redirect(’/‘)来抵达的, 用户界面用if(req.session.user)来判断是否登入, 成功登入后能来到用户界面,但是在用户界面刷新之后req.session.user就为没有了
问题: 1.如何解决 2.req到底是什么,怎么工作的
问题解决了,在if(req.session.user){req.session.user = req.session.user;…}就可以了, 但是一个变量自己等于自身很奇怪!!! 我的理解是浏览器打开一个网址会生成一个request,如果是A redirect 到B, 则callback(req,res){…}里的req来自A,res,end()之后生成的新网页含有新的req, 这时刷新是B to B,而B的req里面就不存在req.session.user了, 而在callback(){ req.session.user = …;}里面这样设置的req会包含在新的网页里面, 所以,问题就解决了; 简单的想想就是说在callback函数里面有两个req,一个属于传进来的,一个属于新页面,当你进行修改req的属性的时候,传进来的req是只读的,所以默认为修改新页面的req,而新页面的req用于新页面跳转时进行传递。
以上是我的分析,纯粹根据结果逆向推理而得,望高手居高临下剖析原理,提出不足
他应该是每一个请求都生成了独立的session,所以刷新一次生成一个,所以刷新前session确实有东西,但是刷新后session就没东西了,你用的啥框架?
express 2.8.x
我觉得如果是这样的话就很不科学了,在用户刷新和进行ajax操作的时候都要写一句代码把原来的session值copy过来,不知道有没有看过源码的来透露下express的session具体实现原理
@kkeys 没有,我用的rrestjs,他们代码是一样的,不过不会发生你所说的问题
kkeys: 应该是你的代码错了,session可以是存储在内存或者数据库中他有一个id。,登陆后,将用户信息存放在cookie, 然后访问用户的页面时,如果session中没有用户的信息,那么就试图从req.cookie中解析,并将得到的这个cookie的id和内容存放在内存或数据库中,每次请求都会根据cookie的id在内存或数据库中找到相应的session信息。至于ajax,我用的是socket.io,在用户登陆后,可以通过请求头,取到cookie,然后将解析cookie的id,然后到数据库中去查询session(我的session存放在mongodb中),然后将这个信息,传给socket.io 的链接,在每次socket请求的时候确认这个session来做相应的权限处理。仅仅个人理解,希望能对你有帮助!
思路很清晰,这个也是我的理解,session的这个机制很久很久之前就是这样的了~