用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3979|回复: 11
收起左侧

session无效 跳转问题

[复制链接]
发表于 2013-3-6 17:02:35 | 显示全部楼层 |阅读模式
本帖最后由 rikeinei@163.co 于 2013-3-6 17:05 编辑

我以前用过Java的filter(过滤器),在里面实现检测session是否有效,无效的话,则全局控制跳转回到 login 画面。
我是php和CI新手,请问在CI里如何全局控制跳转?钩子?还是在父类构造器里实现跳转?
我写了好久,用redirect和Js跳转,貌似都不太好控制啊,有高手能贴出代码参考一下吗?
发表于 2013-3-6 17:30:41 | 显示全部楼层
望楼下高手能解答一下
发表于 2013-3-6 19:49:29 | 显示全部楼层
用钩子是没问题的。
我以前用 MY_Controller 做控制。
另外,这个要看你是 AJAX 请求的还是其他方式的。
 楼主| 发表于 2013-3-7 08:44:41 | 显示全部楼层
本帖最后由 rikeinei@163.co 于 2013-3-7 08:49 编辑

暂时没有用AJAX
我用的是 MY_Controller,在构造函数里面判断会话是否有效。也设置了redirect,但是出现了比较奇怪的现象
1,使用用户登陆 http://localhost/ci/login
2,输入用户名,密码,验证OK,直接redirect进入menu画面 http://localhost/ci/menu
3,点击logout,消除会话,redirect跳回登陆画面http://localhost/ci/login
4,在浏览器地址栏,直接输入 http://localhost/ci/menu,这个时候又进到  http://localhost/ci/menu
     这个时候画面的当前登陆用户名依然显示。(这里是否是浏览器的历史状态?按照道理说,这个时候会话应该已经无效了,里面什么东东都没有了
5,手动刷新浏览器,这个时候才验证到会话无效,跳转到http://localhost/ci/login

我想在会话无效状态下,强行输入 http://localhost/ci/menu的时候,能够不用手动刷新浏览器,直接跳转回 http://localhost/ci/login,不知道怎么整。
发表于 2013-3-7 16:58:24 | 显示全部楼层
rikeinei@163.co 发表于 2013-3-7 08:44
暂时没有用AJAX
我用的是 MY_Controller,在构造函数里面判断会话是否有效。也设置了redirect,但是出现了比 ...

你这个问题就是浏览器缓存造成的,所以你刷新以后就没问题了。
一般来说,这样即使显示已登录页面,也不会有什么问题吧。。。。
 楼主| 发表于 2013-3-11 09:38:54 | 显示全部楼层
Hex 发表于 2013-3-7 16:58
你这个问题就是浏览器缓存造成的,所以你刷新以后就没问题了。
一般来说,这样即使显示已登录页面,也不 ...

这个,,, 怎么能说没有问题了,需要手动刷新本身就是问题

大神,如果使用PHP自带的session是否问题可以解决阿?
发表于 2013-3-11 09:42:19 | 显示全部楼层
rikeinei@163.co 发表于 2013-3-7 08:44
暂时没有用AJAX
我用的是 MY_Controller,在构造函数里面判断会话是否有效。也设置了redirect,但是出现了比 ...

logout->destroy session ?
发表于 2013-3-11 09:47:46 | 显示全部楼层
楼主所说的情况在某些服务器上是存在的,想当初sourceforge的空间服务器没有被封掉的时候,ci在上面部署的时候就会出现这种情况。我想归根结底还是由于CI的session库没有使用原生的session,而是自己写的。HEX兄按照ci的session库函数自己封装了一个使用原生session实现的版本,楼主不妨试一下。
 楼主| 发表于 2013-3-11 10:07:04 | 显示全部楼层
yunnysunny 发表于 2013-3-11 09:47
楼主所说的情况在某些服务器上是存在的,想当初sourceforge的空间服务器没有被封掉的时候,ci在上面部署的 ...

嗯,尝试一下了,多谢
发表于 2013-3-11 10:17:31 | 显示全部楼层
rikeinei@163.co 发表于 2013-3-11 09:38
这个,,, 怎么能说没有问题了,需要手动刷新本身就是问题

大神,如果使用PHP自带的session是否问题可 ...

好吧。。
这个是浏览器缓存造成的问题,也就是说浏览器不发送新的请求给服务器,都不请求服务器了,判断是否注销自然无效了。
我们要解决的问题是如何不是用缓存,而不是说Session有问题,所以我说没问题也是这个意思。
既然知道问题所在,我们就要想办法不是用缓存,这个就属于另外一个话题了。
一般使用发送特殊http header可以解决问题,另一个,可以在请求的URL后面加上随机数。
等等。

本版积分规则