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个用户都在登录的时候,用户甲输入正确,但是这时用户乙点击了验证码,此时用户甲肯定登录不进去。
所以这里的设置还有待改进。
----“做每天该做的事,不计结果!”
---- 因爲對於編程還只是新手,對很多知識掌握的不牢靠,歡迎大家批評指正~~|=-=|~~