登陆控制器需要做的登陆成功把用户ID等信息存入cookie:
1
|
$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 方法:
1
2
3
4
5
6
7
8
9
10
|
/**
* 系统后台 会员登录后 将会员验证内容写入对应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框架有带自己加密规则,具体是否需要加密自己看着设置。
}
|
父类控制器构造方法判断用户是否有登陆:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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 ;
}
|
加密函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
/**
* 加密函数
*
* @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 ;
}
|
解密函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/**
* 解密函数
*
* @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分钟未操作自动退出功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!