2009-11-23 157 views
4

当用户登录我们的网站时,我想更改会话ID,但保留会话中的任何数据。我想有两个原因这样做:更改会话ID并保留数据?

  1. 为了防止用户帐户是在多个地方同时使用(因为如果两个人使用同一个帐户,一个的行动将破坏对方的行动) 。
  2. 让用户继续他/她在另一台计算机上所做的事情(例如从家中的计算机移动到工作)。

这些看起来似乎是矛盾的,但如果您认为它们真的存在矛盾,那真的不是。

问题如下;要获取当前在会话中的数据,我必须致电session_start()。这意味着我以后不能再拨打session_id()来设置新的会话ID。任何想法如何传输会话数据并更改会话ID。

更新:我需要能够自己选择会话ID。 session_regenerate_id()因此不起作用。

+0

'session_regenerate_id()'是解决方案,克莱指出。 – leepowers 2009-11-23 03:02:02

+0

您将如何检索与工作浏览器连接的会话,以便在家中使用浏览器创建新会话? – Don 2009-11-23 03:12:19

+0

@Don:通过将会话ID设置为该用户可重新生成。 @ pygorex1:'session_regenerate_id()'不起作用,我需要自己选择新的会话ID。 – 2009-11-23 03:15:49

回答

10

您可能能够使用session_regenerate_id()

<?php 
session_start(); 

$old_sessionid = session_id(); 

session_regenerate_id(); 

$new_sessionid = session_id(); 

echo "Old Session: $old_sessionid<br />"; 
echo "New Session: $new_sessionid<br />"; 

print_r($_SESSION); 
?> 

甚至较粗略的方法威力工作:

// save the session 
session_start(); 
$session = array(); 
foreach ($_SESSION as $k => $v) { 
    $session[$k] = $v; 
} 
session_commit(); 

// create new session and copy variables 
session_id("new session id"); 
session_start(); 
foreach ($session as $k => $v) { 
    $_SESSION[$k] = $v; 
} 
+0

第一种方法应该是足够的。 – powtac 2009-11-23 03:22:20

+0

+1也帮助我.. – 2011-03-23 02:19:36

+1

使用'$ session = $ _SESSION'然后(设置新的会话ID之后)'$ _SESSION = $ session'是错误的吗? – TheFrost 2014-03-08 10:27:31

-1

或者,你可能只是能够使用的东西像这样:

$path=session_save_path(); 
$whatever_session_id; 

通过这些变量下一页:

session_id()=$whatever_session_id; 
session_save_path()=$path; 

你会在新的会话ID的路径设置到旧的会话数据.... 我不知道这是真的什么你会想,就在这里。

0

使用此。它把一个函数:

function update_session($newsessid = '') { 

    // Backup the current session 
     $session_backup = $_SESSION; 

    // Set current session to expire in 1 minute    
     $_SESSION['OBSOLETE'] = true; 
     $_SESSION['EXPIRES'] = time() + 60; 

    // Close the current session 
     session_write_close(); 

    // Set a new session id and start the session   
     $newSession = session_id($newsessid); 
     session_start(); 

    // Restore the previous session backup 
     $_SESSION = $session_backup; 

    // Clean up 
     unset($session_backup);     
     unset($_SESSION['OBSOLETE']); 
     unset($_SESSION['EXPIRES']);  
} 

需要时你可以这样调用它:

update_session($customid);