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 相关文章推荐
php查看session内容的函数
Aug 27 PHP
建站常用13种PHP开源CMS比较
Aug 23 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
thinkphp 验证码 的使用小结
May 07 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
Aug 03 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 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
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
python实现自动更换ip的方法
2015/05/05 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
pytorch 常用线性函数详解
2020/01/15 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
python 伯努利分布详解
2020/02/25 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
努比亚手机官网:nubia
2016/10/06 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
企业治理工作自我评价
2013/09/26 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
开学典礼观后感
2015/06/15 职场文书
初中生物教学随笔
2015/08/15 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript