2017-03-15 64 views
4

我想使用session_id()获取会话ID;但我知道它会在每5分钟后重新生成一次。在codeigniter中获取唯一的会话ID

所以我有一个把随机数设置成用户定义的会话变量的技巧。像,

$uniqueId = uniqid(rand(), TRUE); 
$this->session->set_userdata("my_session_id", md5($uniqueId)); 

现在问题是我应该在哪里放置此代码。如果我把这段代码放在我的控制器的构造函数中,它会在每个请求中执行。并会为每个请求提供不同的会话ID。

如何设置此会话变量只有一次?并且在会话销毁之前它不会改变()。

+1

在登录控制器时,当您成功登录后将用户重定向并将数据保存在会话中 –

+0

但我还想为访客用户分配session_id。 –

+0

http:// stackoverflow。com/questions/13945603/how-do-codeigniters-sess-time-to-update-work,这可能有帮助 –

回答

0

在config.php中设置下面的,那么你就不必生成自己的会话ID

$config['sess_expiration'] = 0;//Session does not expire 
$config['sess_time_to_update'] = 0;//Disable session ID regeneration 

在你的控制器,你需要__construct()

public function __construct(&$params){ 
    // DO NOT forget this 
    parent::__construct($params); 
} 

那么您什么时候得到您要使用的会议

$this->session->userdata('id'); 
+0

我可以设定这个时间,但现在会发生什么。我得到$ session_id = session_id();在构造函数中。理想情况下,每次执行这个函数都会发生什么,$ session id保持不变。但每次调用函数都会改变它。如何解决这个问题? –

+0

看到我的更新回答 – theEUG

1

在您的constructor chec ķ会议already set or not。如果第一次会议是否也不会设置set it否则do nothing。像这个..

$uniqueId = uniqid(rand(), TRUE);//generates random number 
if(!$this->session->has_userdata('my_session_id'))//if session is not set then it sets (if your session has already value then this step will be skip out) 
{ 
$this->session->set_userdata("my_session_id", md5($uniqueId)); 
} 
+0

对每个请求控制进入如果条件,并重置值。我只是不明白为什么它返回false has_userdata('my_session_id')??并执行如果语句 –

+0

任何想法为什么它重置my_session_id变量? –

+3

编写'$ uniqueId = uniqid(rand(),TRUE);'if if if;)会更好些 – ICE

2
  1. 这是更好地再生会话ID为防止对会话劫持。禁用会话Id再生是不好的想法。请阅读When and why I should use session_regenerate_id()?了解更多信息。

  2. 如果您想通过会话识别用户,那么使用会话ID并不是一个好主意。

  3. 您可以在会话中设置用户标识并将其用作登录的标识。为了更安全,您可以将随机字符串作为密钥存储在数据库中,并将其设置在会话中。在检查时,您可以将会话中的用户ID和该密钥与数据库上的用户ID和密钥进行比较。

  4. 如果您想为客户的客户同样的事情,你可以做什么,我在#3提到和存储$_SESSION['guest']=USER_IP和存储来宾IP数据库上创建一个客桌。并且如果isset($_SESSION['guest'])检查访客表而不是用户表。

  5. 如果您希望保护会话免受XSS影响,您可以存储其他用户信息,例如IP,并在代码开始时检查该信息。

-1

使用PHP的内置功能:

$session_id = session_id(); 

现在$session_id是一个独特的会话ID。