登陆控制器需要做的登陆成功把用户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分钟未操作自动退出功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!