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截取中文字符串的问题
Jul 12 PHP
mysql 性能的检查和优化方法
Jun 21 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
解析isset与is_null的区别
Aug 09 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
PHP 实现判断用户是否手机访问
Jan 21 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
PHP读取大文件的几种方法介绍
Oct 27 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 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一个找二层目录的小东东
2012/08/02 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
AngularJS手动表单验证
2016/02/01 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
python使用socket远程连接错误处理方法
2015/04/29 Python
浅析Git版本控制器使用
2017/12/10 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
外贸实习生自荐信范文
2013/11/24 职场文书
大学军训感想
2014/02/12 职场文书
简单租房协议书范本
2014/08/20 职场文书
借条如何写
2015/05/26 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
python中的plt.cm.Paired用法说明
2021/05/31 Python