PHP利用Cookie设置用户30分钟未操作自动退出功能


Posted in PHP onJuly 03, 2017

登陆控制器需要做的登陆成功把用户ID等信息存入cookie:

$this->systemSetKey(array(‘name‘=>$admin_info[‘admin_name‘], ‘id‘=>$admin_info[‘admin_id‘],‘gid‘=>$admin_info[‘admin_gid‘],‘sp‘=>$admin_info[‘admin_is_super‘]));//登陆成功之后做得事情

父类中的 systemSetKey 方法:

/**
   * 系统后台 会员登录后 将会员验证内容写入对应cookie中
   *
   * @param string $name 用户名
   * @param int $id 用户ID
   * @return bool 布尔类型的返回结果
   */
  protected final function systemSetKey($user){
    setNcCookie(‘sys_key‘,encrypt(serialize($user),MD5_KEY),3600,‘‘,null);//设置cookie 过期时间为30分钟。这边设置cookie框架有带自己加密规则,具体是否需要加密自己看着设置。
  }

父类控制器构造方法判断用户是否有登陆:

protected function __construct(){
    Language::read(‘common,layout‘);
    /**
     * 验证用户是否登录
     * $admin_info 管理员资料 name id
     */
    $this->admin_info = $this->systemLogin();//取得管理员的资料,之后的子类控制器继承构造方法
    if ($this->admin_info[‘id‘] != 1){
      // 验证权限
      $this->checkPermission();
    }
    //转码 防止GBK下用ajax调用时传汉字数据出现乱码
    if (($_GET[‘branch‘]!=‘‘ || $_GET[‘op‘]==‘ajax‘) && strtoupper(CHARSET) == ‘GBK‘){
      $_GET = Language::getGBK($_GET);
    }
  }
  /**
   * 系统后台登录验证
   *
   * @param
   * @return array 数组类型的返回结果
   */
  protected final function systemLogin(){
    //取得cookie内容,解密,和系统匹配
    $user = unserialize(decrypt(cookie(‘sys_key‘),MD5_KEY));//取cookie 里面储存的信息,现在使用的框架里面自定义了cookie的加密方式
    if (!key_exists(‘gid‘,(array)$user) || !isset($user[‘sp‘]) || (empty($user[‘name‘]) || empty($user[‘id‘]))){  //假如不存在说明用户没登陆或者用户长时间未操作cookie时间过期 跳到登陆页面去
      @header(‘Location: index.php?mod=login&action=login‘);exit;
    }else {
      $this->systemSetKey($user);//如果用户有登陆的话,每一个操作都会重写刷新cookie;
    }
    return $user;
  }

加密函数:

/**
 * 加密函数
 *
 * @param string $txt 需要加密的字符串
 * @param string $key 密钥
 * @return string 返回加密结果
 */
function encrypt($txt, $key = ‘‘){
  if (empty($txt)) return $txt;
  if (empty($key)) $key = md5(MD5_KEY);
  $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
  $ikey ="-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
  $nh1 = rand(0,64);
  $nh2 = rand(0,64);
  $nh3 = rand(0,64);
  $ch1 = $chars{$nh1};
  $ch2 = $chars{$nh2};
  $ch3 = $chars{$nh3};
  $nhnum = $nh1 + $nh2 + $nh3;
  $knum = 0;$i = 0;
  while(isset($key{$i})) $knum +=ord($key{$i++});
  $mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum%8,$knum%8 + 16);
  $txt = base64_encode(time().‘_‘.$txt);
  $txt = str_replace(array(‘+‘,‘/‘,‘=‘),array(‘-‘,‘_‘,‘.‘),$txt);
  $tmp = ‘‘;
  $j=0;$k = 0;
  $tlen = strlen($txt);
  $klen = strlen($mdKey);
  for ($i=0; $i<$tlen; $i++) {
    $k = $k == $klen ? 0 : $k;
    $j = ($nhnum+strpos($chars,$txt{$i})+ord($mdKey{$k++}))%64;
    $tmp .= $chars{$j};
  }
  $tmplen = strlen($tmp);
  $tmp = substr_replace($tmp,$ch3,$nh2 % ++$tmplen,0);
  $tmp = substr_replace($tmp,$ch2,$nh1 % ++$tmplen,0);
  $tmp = substr_replace($tmp,$ch1,$knum % ++$tmplen,0);
  return $tmp;
}

  解密函数:

/**
 * 解密函数
 *
 * @param string $txt 需要解密的字符串
 * @param string $key 密匙
 * @return string 字符串类型的返回结果
 */
function decrypt($txt, $key = ‘‘, $ttl = 0){
  if (empty($txt)) return $txt;
  if (empty($key)) $key = md5(MD5_KEY);
  $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
  $ikey ="-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
  $knum = 0;$i = 0;
  $tlen = @strlen($txt);
  while(isset($key{$i})) $knum +=ord($key{$i++});
  $ch1 = @$txt{$knum % $tlen};
  $nh1 = strpos($chars,$ch1);
  $txt = @substr_replace($txt,‘‘,$knum % $tlen--,1);
  $ch2 = @$txt{$nh1 % $tlen};
  $nh2 = @strpos($chars,$ch2);
  $txt = @substr_replace($txt,‘‘,$nh1 % $tlen--,1);
  $ch3 = @$txt{$nh2 % $tlen};
  $nh3 = @strpos($chars,$ch3);
  $txt = @substr_replace($txt,‘‘,$nh2 % $tlen--,1);
  $nhnum = $nh1 + $nh2 + $nh3;
  $mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum % 8,$knum % 8 + 16);
  $tmp = ‘‘;
  $j=0; $k = 0;
  $tlen = @strlen($txt);
  $klen = @strlen($mdKey);
  for ($i=0; $i<$tlen; $i++) {
    $k = $k == $klen ? 0 : $k;
    $j = strpos($chars,$txt{$i})-$nhnum - ord($mdKey{$k++});
    while ($j<0) $j+=64;
    $tmp .= $chars{$j};
  }
  $tmp = str_replace(array(‘-‘,‘_‘,‘.‘),array(‘+‘,‘/‘,‘=‘),$tmp);
  $tmp = trim(base64_decode($tmp));
  if (preg_match("/\d{10}_/s",substr($tmp,0,11))){
    if ($ttl > 0 && (time() - substr($tmp,0,11) > $ttl)){
      $tmp = null;
    }else{
      $tmp = substr($tmp,11);
    }
  }
  return $tmp;
}

以上所述是小编给大家介绍的PHP利用Cookie设置用户30分钟未操作自动退出功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
打造计数器DIY三步曲(上)
Oct 09 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
深入apache配置文件httpd.conf的部分参数说明
Jun 28 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
让Laravel API永远返回JSON格式响应的方法示例
Sep 05 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 #PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 #PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 #PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 #PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 #PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 #PHP
php获取文章内容第一张图片的方法示例
Jul 03 #PHP
You might like
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
php 清除网页病毒的方法
2008/12/05 PHP
php cookis创建实现代码
2009/03/16 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
javascript CSS画图之基础篇
2009/07/29 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
利用Python如何将数据写到CSV文件中
2018/06/05 Python
python爬取淘宝商品销量信息
2018/11/16 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
python else语句在循环中的运用详解
2020/07/06 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
初中三好学生事迹材料
2014/01/13 职场文书
幼儿教师工作感言
2014/02/14 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
群众路线对照检查材料
2014/09/22 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
校长个人总结
2015/03/03 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs