我想做一个‘一星期内自动登录’功能,后端登录代码如下:`
class loginController extends core\lib\Controller{ public function login() { if($_POST['autoLogin']==1) { ini_set('session.gc_maxlifetime', "604800"); // 秒 ini_set("session.cookie_lifetime","604800"); // 秒 } session_start(); if(strtolower($_SESSION['vCode'])!=strtolower($_POST['vCode'])) { echo 'vCode_error'; exit(0); } $model=new mongoModel('wind','users'); $name=$model->findOne('name',$_POST['username']); if(!empty($name)) { if($name['password']==$_POST['password']) { $_SESSION['username']=$_POST['username']; echo 'success'; } else echo 'password_error'; } else { echo 'user_error'; } } }`
通过前端传来的‘ autoLogin ’值来判断用户是否选择了‘一周内自动登录’这个 checkbox,如果选择,则更改 session 和保存了 sessionid 的 cookie 的最大保存时间为 1 个星期。但是我发现这样不行, cookie 的有效期依然为结束会话时销毁,但是我把:
ini_set('session.gc_maxlifetime', "604800");
ini_set("session.cookie_lifetime","604800");
这两段代码放到项目入口文件里, cookie 的有效期成功到了一个星期以后,这是为啥呢?作用域的问题吗? 新手求问。
1
vibbow 2017-04-06 22:45:56 +08:00
好像 LZ 对 session 的用法产生了一些理解上的偏差......
|
2
msg7086 2017-04-07 01:26:35 +08:00
为什么用户的登录选项代码里你要修改服务器的综合配置?
|
5
vibbow 2017-04-07 14:11:56 +08:00
@loogle
session 之所以称之为 session ,就是给当前会话用的,浏览器关了会话就结束了。 你要做自动登录,信息是需要存在 cookies 里,而不是 session 里的。 更不是通过 session 存在 cookies 里... |
6
loogle OP @vibbow 你这也是解决方法,信息都放在 cookie 里很容易实现自动登录,但很不安全,还是放服务端安全一些,你不可能通过判断是否存在 cookie 就自动登录吧。客户端是靠存在 cookie 里的一个 session id 与服务端 session 通信的,一个 seeion id 对应一个连接,要用 session 存信息就离不开 cookie ,假设要把信息保存一星期,除了设置 session 最大保存时间外还要设置存放了 session id 的 cookie 的最大保存时间,我这写法没错,我也找到了原因所在,原来我在首页的控制器中用到了 session,这个时候 session_start()这个函数已经把默认 session 配置加载进来,而我在登录的时候去再去改默认配置已经不行了,我把首页的 session-start()去掉,果然可以保存一星期了
|