做一个网站系统,用户每一次请求都要检查登录信息,而这些信息一般是保存在session或者cookie中,所以一般会判断session或者cookie中是否有数据来确定是否登录了。
遇到一种情况,就是在后台管理用户的时候,例如把某一个用户删除了,但是该用户只要还保留session数据的话还是能操作的。
针对这种情况,我想到两种办法:
1:每一次检查用户是否登录的时候要实时的查询表数据,不单单是检查session。
2:用数据库来保存用户的cookieId,当用户状态改变时候,修改对应的session数据。
不知道还有没有其他更好的办法来解决。欢迎交流,一起学习。
8 回答
![?](http://img1.sycdn.imooc.com/5458472300015f4702200220-100-100.jpg)
开心每一天1111
TA贡献1836条经验 获得超13个赞
先来复习一下session的基本原理:
a.生成过程:
用户在客户端输入用户名密登录 -> 服务器验证用户名密码正确 -> 服务器随机生成一个token(一般叫session_id) -> 服务端以session_id为主键(或key),绑定session数据(最基本就是uid,有时会加上基本的用户profile数据) -> 将session_id返回给客户端(一般是cookie)
b.使用:
客户端带session_id访问(一般是cookie) -> 服务端根椐session_id查询session,如有,则认证成功,继续根椐session的内容(如uid)获取业务数据。
再回到你的问题,其实你的思路基本是对的:
- 用户访问时,先查询session,如果已登录,再查uid是否存在 ,uid存在才认证成功。
如果担心性能问题,可把uid直接用本地内存或memcache等缓存起来(删除用户时同时清除缓存,缓存丢了就重新登录)
- 保存session时,建立与uid的映射, 比如:
如果session是存在关系数据库,那就 sid,session,将用户id作为session的值,那样,删除用户时就可以删除该用户的session
如果session存在文件或者redis之类, 可以在生成session时同时建立反向映射关系保存,目的也是当后台删除用户时可以找到对应用户的session来删除
![?](http://img1.sycdn.imooc.com/54585094000184e602200220-100-100.jpg)
哔哔one
TA贡献1854条经验 获得超8个赞
如果每次请求,频繁查询数据库并不理想。
常用过一个小技巧就是,写个定时ajax请求,如每隔5分钟检查一次。这种方法简单。
还有一种方法就是使用socket实现,如单点登陆原理一样实现
![?](http://img1.sycdn.imooc.com/54584f3100019e9702200220-100-100.jpg)
繁花不似锦
TA贡献1851条经验 获得超4个赞
简单说一下我们的设计思路吧。我这边是每次请求,都会重新生成一个新的sessionId,返回给前端,前端将sessionId设置到header,每次请求将sessionId携带传递给服务端,服务端将获取sessionId进行对比,前端一般sessionId存储到localstorage或cookie中,服务端将sessionId一般存储到数据库或者缓存
![?](http://img1.sycdn.imooc.com/533e4d470001a00a02000200-100-100.jpg)
红糖糍粑
TA贡献1815条经验 获得超6个赞
自己想到一个方法,不知道可行不。欢迎交流。
就是保存的session文件名都是有sessionID的,那么只要保存好sessionID,直接使用unlink去删除那个文件,可否?
- 8 回答
- 0 关注
- 851 浏览
添加回答
举报
0/150
提交
取消