2011-05-18 56 views
1

对于用户认证,我的客户端重定向到服务器并获取用户数据,并将其存储到客户端的php本地会话中。在这个过程中,服务器重定向到相同请求的url,所以如果没有数据响应,客户端不会有任何会话,并且我的脚本将在重定向循环中结束,因为只有在未找到会话时才会检查重定向到服务器。检查会话的uniqid

现在为了避免这种情况,我使用uniqid('prefix_')函数在第一个流之后创建了一个随机会话。但是如果有人刷新页面,请求应该再次到服务器进行认证。

为此,我正在检查会话cookie值。如果cookie有我给定的前缀(以uniqid给出),那么它不是有效的会话并重定向到服务器。我想知道这个选项有多可靠?我有其他解决方案吗?

更新: 这里我有多么validSession函数看起来像:

public function validSession() {
if ($sessionCookie !== null && substr($sessionCookie,0,7) !== 'prefix_')
return true;
return false;
}

所以,如果会话cookie包含用于从服务器中没有数据的情况下创建随机会话前缀,这个函数将返回我假,我会决定重定向到用户会话的服务器。

+0

太多混乱没有代码..请将代码添加到您的问题中。 – 2011-05-18 11:24:09

回答

0

听起来像是流量控制问题。如果登录失败,请不要重新导向回去。

@session_start(); 
$user = Auth::login($username, $pwd); 
if (!empty($user)) 
{ 
    $_SESSION['auth_user'] = $user; 
    session_write_close(); 
    header('Location: '.$_REQUEST['next']); 
} 
else 
{ 
    header('Location: '.Auth::STANDARD_LOGIN_URL); 
} 

这个例子使用一个伪验证类,具有静态登录方法(返回一个用户或假/空失败),和恒定的,其限定到哪里登录。

+0

抑制由session_start()引起的潜在错误,例如无法设置会话cookie,这是后来难以调试的难题。 – ThiefMaster 2011-05-18 11:33:59

+0

通常不需要调用'session_write_close()' - 它会自动完成。如果脚本在完成访问会话后要完成一些耗时的工作,则只需要它。 – ThiefMaster 2011-05-18 11:35:07

+0

我可以买那个参数 - 但是代码中的#1问题是,如果你有一堆代码,你不会轻易知道会话是否已经启动......并且适当的管理设置会使复杂我的简化演示大大。这是我的标准类具有所有会话管理抽象的原因之一。 – 2011-05-18 11:38:29