大多数网站在用户登录时会提供一个“记住我”或者“保持登录状态”的选项,我只知道是用Cookie实现的,但是具体来说的工作流程是什么?因为要实现一个网站登录的东西,所以想从细节方面了解这个问题。
<code class="language-php"><span class="x">//验证用户名和密码成功后</span> <span class="x">$_SESSION['userinfo'] = [</span> <span class="x"> 'uid' => 123,</span> <span class="x"> 'username' => 'testuser'</span> <span class="x">];</span> </code>
<code class="language-php"><span class="x">function set_cookie($data,$path = '/',$time = 0,$doma = NULL)</span> <span class="x">{</span> <span class="x"> if(!is_array($data))</span> <span class="x"> {</span> <span class="x"> $para = func_get_args();</span> <span class="x"> $data = array($para[0] => $para[1]);</span> <span class="x"> $path = isset($para[2]) ? $para[2] : '/';</span> <span class="x"> $time = isset($para[3]) ? $para[3] : 0;</span> <span class="x"> $doma = isset($para[4]) ? $para[4] : NULL;</span> <span class="x"> }</span> <span class="x"> if(is_int($path))</span> <span class="x"> {</span> <span class="x"> $time = $path;</span> <span class="x"> $path = '/';</span> <span class="x"> }</span> <span class="x"> if(is_string($time))</span> <span class="x"> {</span> <span class="x"> $doma = $time;</span> <span class="x"> $time = 0;</span> <span class="x"> }</span> <span class="x"> $time = $time == 0 ? $time : time()+$time;</span> <span class="x"> foreach($data as $key => $value)</span> <span class="x"> {</span> <span class="x"> if(!is_array($value))</span> <span class="x"> {</span> <span class="x"> if(strpos($key,'.') === FALSE)</span> <span class="x"> {</span> <span class="x"> if(isset($_COOKIE[$key]))</span> <span class="x"> {</span> <span class="x"> if(is_array($_COOKIE[$key]))</span> <span class="x"> {</span> <span class="x"> $cookie_str = http_build_query(array($key => $_COOKIE[$key]));</span> <span class="x"> $cookie_arr = explode('&',$cookie_str);</span> <span class="x"> foreach($cookie_arr as $cookie)</span> <span class="x"> {</span> <span class="x"> $a_cookie = explode('=',$cookie);</span> <span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span> <span class="x"> }</span> <span class="x"> $_COOKIE[$key] = NULL;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> setcookie($key,$value,$time,$path,$doma);</span> <span class="x"> $_COOKIE[$key] = $value;</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cop = &$_COOKIE;</span> <span class="x"> $cox = substr_count($key,'.');</span> <span class="x"> foreach(explode('.',$key) as $ckk => $ckey)</span> <span class="x"> {</span> <span class="x"> if($ckk > 0)</span> <span class="x"> {</span> <span class="x"> $cookie_key .= '['.$ckey.']';</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cookie_key = $ckey;</span> <span class="x"> }</span> <span class="x"> if($ckk <span class="x"> {</span> <span class="x"> if(isset($cop[$ckey]))</span> <span class="x"> {</span> <span class="x"> if(!is_array($cop[$ckey]))</span> <span class="x"> {</span> <span class="x"> setcookie($cookie_key,NULL,-1,$path,$doma);</span> <span class="x"> $cop[$ckey] = NULL;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cop[$ckey] = NULL;</span> <span class="x"> }</span> <span class="x"> $cop = &$cop[$ckey];</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> if(isset($cop[$ckey]))</span> <span class="x"> {</span> <span class="x"> if(is_array($cop[$ckey]))</span> <span class="x"> {</span> <span class="x"> $cookie_str = http_build_query(array($cookie_key => $cop[$ckey]));</span> <span class="x"> $cookie_arr = explode('&',$cookie_str);</span> <span class="x"> foreach($cookie_arr as $cookie)</span> <span class="x"> {</span> <span class="x"> $a_cookie = explode('=',$cookie);</span> <span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span> <span class="x"> }</span> <span class="x"> $cop[$ckey] = NULL;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cop[$ckey] = NULL;</span> <span class="x"> }</span> <span class="x"> $cop = &$cop[$ckey];</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> setcookie($cookie_key,$value,$time,$path,$doma);</span> <span class="x"> $cop = $value;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $x_cookie_str = http_build_query($value);</span> <span class="x"> $x_cookie_arr = explode('&',$x_cookie_str);</span> <span class="x"> foreach($x_cookie_arr as $x_cookie)</span> <span class="x"> {</span> <span class="x"> $a_cookie = explode('=',$x_cookie);</span> <span class="x"> if(isset($a_cookie[1]))</span> <span class="x"> {</span> <span class="x"> set_cookie($key.'.'.str_replace(array('[',']'),array('.',''),urldecode($a_cookie[0])),urldecode($a_cookie[1]),$time,$path,$doma);</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x">}</span> <span class="x">function cookie($key = NULL,$def = FALSE)</span> <span class="x">{</span> <span class="x"> if(!empty($key))</span> <span class="x"> {</span> <span class="x"> if(strpos($key,'.') === FALSE)</span> <span class="x"> {</span> <span class="x"> if(isset($_COOKIE[$key]))</span> <span class="x"> {</span> <span class="x"> return $_COOKIE[$key];</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> return $def;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cop = &$_COOKIE;</span> <span class="x"> foreach(explode('.',$key) as $ckey)</span> <span class="x"> {</span> <span class="x"> if(isset($cop[$ckey]))</span> <span class="x"> {</span> <span class="x"> $cop = &$cop[$ckey];</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> return $def;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> return $cop;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> return $_COOKIE;</span> <span class="x"> }</span> <span class="x">}</span> <span class="x">function unset_cookie($key = NULL,$path = '/',$doma = NULL)</span> <span class="x">{</span> <span class="x"> if(!empty($key))</span> <span class="x"> {</span> <span class="x"> if(strpos($key,'.') === FALSE)</span> <span class="x"> {</span> <span class="x"> if(isset($_COOKIE[$key]))</span> <span class="x"> {</span> <span class="x"> if(!is_array($_COOKIE[$key]))</span> <span class="x"> {</span> <span class="x"> setcookie($key,NULL,-1,$path,$doma);</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cookie_str = http_build_query(array($key => $_COOKIE[$key]));</span> <span class="x"> $cookie_arr = explode('&',$cookie_str);</span> <span class="x"> foreach($cookie_arr as $cookie)</span> <span class="x"> {</span> <span class="x"> $a_cookie = explode('=',$cookie);</span> <span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> unset($_COOKIE[$key]);</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cop = &$_COOKIE;</span> <span class="x"> $ckeys = explode('.',$key);</span> <span class="x"> $pop_ckey = array_pop($ckeys);</span> <span class="x"> foreach($ckeys as $ckk => $ckey)</span> <span class="x"> {</span> <span class="x"> if($ckk > 0)</span> <span class="x"> {</span> <span class="x"> $cookie_key .= '['.$ckey.']';</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cookie_key = $ckey;</span> <span class="x"> }</span> <span class="x"> if(isset($cop[$ckey]))</span> <span class="x"> {</span> <span class="x"> $cop = &$cop[$ckey];</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> return;</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> if(isset($cop[$pop_ckey]))</span> <span class="x"> {</span> <span class="x"> if(!is_array($cop[$pop_ckey]))</span> <span class="x"> {</span> <span class="x"> setcookie($cookie_key.'['.$pop_ckey.']',NULL,-1,$path,$doma);</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> $cookie_str = http_build_query(array($cookie_key.'['.$pop_ckey.']' => $cop[$pop_ckey]));</span> <span class="x"> $cookie_arr = explode('&',$cookie_str);</span> <span class="x"> foreach($cookie_arr as $cookie)</span> <span class="x"> {</span> <span class="x"> $a_cookie = explode('=',$cookie);</span> <span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> unset($cop[$pop_ckey]);</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x"> else</span> <span class="x"> {</span> <span class="x"> if(!empty($_COOKIE))</span> <span class="x"> {</span> <span class="x"> $cookie_str = http_build_query($_COOKIE);</span> <span class="x"> $cookie_arr = explode('&',$cookie_str);</span> <span class="x"> foreach($cookie_arr as $cookie)</span> <span class="x"> {</span> <span class="x"> $a_cookie = explode('=',$cookie);</span> <span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span> <span class="x"> }</span> <span class="x"> $_COOKIE = array();</span> <span class="x"> }</span> <span class="x"> }</span> <span class="x">}</span> </span></code>
<code class="language-php"><span class="x">// 登录成功后记录登录信息</span> <span class="x">$_SESSION['loginStatus'] = array(</span> <span class="x"> 'username' => $username,</span> <span class="x"> 'status' => true,</span> <span class="x"> 'loginTime' = > time(),</span> <span class="x">);</span> <span class="x">.</span> <span class="x">.</span> <span class="x">.</span> <span class="x">// 判断session信息</span> <span class="x">if(empty($_SESSION['loginStatus']['status']) || !$_SESSION['loginStatus']['status']) {</span> <span class="x"> // 引导到登录页</span> <span class="x">} else {</span> <span class="x"> // 加载用户信息</span> <span class="x">}</span> </code>