ThinkPHP中再谈 禁用cookie 使用session

因为我的其他浏览器都默认开启的cookie,所以在登录的时候按照往常的办法,没有问题。

但是因为以前我的火狐浏览器禁用过cookie(开始没发现),所以一致无法登陆。

而为了方便控制我一直是将'SESSION_AUTO_START'=>false;

因为每一次session_start()都会重新产生一个session_id();

所以这里就出现了问题:

我在其他页面,需要判断,用户是否存储了session(这里我用的公共控制器判断,其他页面继承这个公共控制器,登录页除外),从而判断是否可以停留浏览这个页面,而在验证码处,我需要开启session;不知道这里是不是这个原因,导致我在登录页存储的session_id(),始终无法在我登录处理的方法中获得。无奈之下我修改了判断验证码的方式。

打开Image.class.php

找到产生验证码的方法,Ctrl+F 搜索 buildImageVerify

在这个方法中,有一个获取随机字符串的代码,$randval = String::randString($length, $mode);

我讲这个随机字符串存储在文件中,F('verify',md5($randval));//默认路径是./Public/Data/ 下

在登录处理方法中

/*验证验证码*/
if (md5(strtoupper($vcode)) != F('verify')) {
     echo json_encode(array('status'=>-3, 'msg' => '验证码错误'));
     die;
}

这样就解决了验证码的处理

但是依然有问题,因为在登录处理中,我存储了一些用户信息到session中,这个怎么传递存储的session_id()能否传递呢?

session_start();
$_SESSION['admin']['last_logtime'] = $lastlogintime;
$_SESSION['admin']['auName'] = $auName;
$_SESSION['admin']['lastlogip'] = $lastlogip;
F('ssid',session_id());

我把这里生成的session_id,通过F方法存储到了ssid.php文件中

于是公共控制器的判断

session_id(F('ssid'));//新加入的代码,原来没有这一行,在开启session之前先获得需要的session_id
session_start();
if (!isset($_SESSION['admin']['auName']) || !isset($_SESSION['admin']['last_logtime'])) {           
        header('Location:'.U(GROUP_NAME.'/Login/index/'));
}

于是这里我想到了一个思路:

就是当浏览器的用户禁用了cookie之后,我把验证码存储在服务器端的文件中,而在用户登录成功后,在把用户存储在session中时要先获得session_id将之存储在文件中,在公共控制器中调用。

可是,貌似这里我又想到同时产生了一个问题?

当2个用户都在登录的时候,用户甲输入正确,但是这时用户乙点击了验证码,此时用户甲肯定登录不进去。

所以这里的设置还有待改进。

 

posted @ 2014-09-13 13:01  Zell~Dincht  阅读(1023)  评论(0编辑  收藏  举报