代码很简单 实现的方式很多,用cookies 用static 变量 file文件缓存 等等
比如
//简单行为管理,如果请求此方法次数多于5次,就显示验证码 吧当前方法的name传进来,有效时间是5分钟,$return=1是增加,$return=2就是只是返回$_COOKIE[$name]的值 function behavior_function($function = __FUNCTION__, $class = __CLASS__, $return=1) { $name = 'behavior_' . $class . '_' . $function; if($return ==1) { setcookie($name, $_COOKIE[$name] + 1, time() + 3000, "/"); }elseif($return ==2){ return $_COOKIE[$name] > 5 ? true : false; } }
调用
public function index() { if (IS_POST) { //尝试登陆次数增加 behavior_function(__FUNCTION__, __CLASS__,1); } else { $res = behavior_function(__FUNCTION__, __CLASS__,2); $codes = $res === true ? 1 : NULL; $this->assign("codes", $codes); $this->display(); } }
//为了微信页面好看,将中文字符小于4的补充空格
function cn_string_to_4($str) { if(mb_strlen($str,'utf8') <4){ return $str = $str.str_repeat(' ', (4-mb_strlen($str,'utf8'))); } return $str; }
通过cookies,做一个简单的。使用session做过期验证码的功能
这有2个版本
/* * 设置一个定时有效的session值, tp的session函数貌似没有这个功能 * * $time 格式是实践戳 * * $type 1 储存 和 更新session存活时间 * 2 查看获取 * 3 销毁 */ function session_limit_time_save($type=1,$name='', $value = '', $expire = '') { $session_time_name = $name . "_time"; $session_expire = $name . 'expire'; switch ($type) { case 1: $_SESSION["$name"] = $value; $_SESSION["$session_time_name"] = time(); $_SESSION["$session_expire"] = $expire; break; case 2: if (time() - $_SESSION["$session_time_name"] > $_SESSION["$session_expire"]) { //访问过期session,就销毁 unset($_SESSION["$name"]); unset($_SESSION["$session_time_name"]); unset($_SESSION["$session_expire"]); return NULL; } else { return $_SESSION["$name"]; } break; case 3: unset($_SESSION["$name"]); unset($_SESSION["$session_time_name"]); unset($_SESSION["$session_expire"]); break; default: echo '数据处理模式错误!'; break; } }
这个不太好,因为在$_SESSION上可以看到其他的值,其实一般都是借助cookies来实现过期判断
比如
$time = 30 * 30;//半小时过期 setcookie(session_name(), session_id(), time() + $time);
我还尝试过使用,直接访问session的temp文件,去实现过期,但是发现,session存的数据格式是
ss|s:4:"1111";ees|s:4:"1111";e1es|s:2:"55";ee2s|s:2:"22";ee3s|s:6:"155111";
没有存放过期时间,是通过设置的全局过期时间,做创建时间过期,删除和更新的
伪代码:
$session_path = "sess_".session_id(); $sessionpath = session_save_path(); $file_name_path = $sessionpath.'/'.$session_path; //$a=filemtime($file_name_path); $a=filectime($file_name_path); //$a=fileatime($file_name_path); $r = date("Y-m-d H:i:s",$a); var_dump($r); $rr = get_cfg_var('session.gc_maxlifetime'); var_dump($rr);
发现效果不是很好,最后决定借用cookies来做定时过期
自动登录
原理很简单就是在你需要控制的需要登录控制的父控制器做一个__construct方法,在登录的去set一个cookies ,可解密的加密算法,
public function __construct() {
//解密
}
当然在登录的时候记得让cookies 过期,不然会出现,退出依然可以登录问题
访问需要权限的时候,去获取cookies,解密获取账号和密码,在去模拟登录,创建session,和登录差不多,cookies没有就什么都不做就,让权限系统去出路页面访问权限