以下是该方案:
有5个网站(不同的域名)需要共享会话。我在每个站点上使用一些代码返回“blank.gif”图像,同时设置会话(将其同步到当前会话)。每个站点都会从其他每个站点调用session-img。此外,所有站点都可以访问相同的数据库(存储会话的位置)。这适用于FF和Chrome,但不适用于IE(或Safari PC)......
我需要提出另一种方法来保持会话活跃吗?该应用是一个小型自定义CMS,所以实际上只有2-3人会使用它。
我可以通过IP识别用户登录,然后继续检查所有站点的IP ...
是否有更精细的内容,例如我可以检查的计算机uuid?
答案 0 :(得分:2)
任何能够在没有用户合作的情况下实现这一目标的事情都将成为用户隐私和匿名方面的错误,最终会被修复。网站不应该能够找出用户去过的其他网站以及他在那里做了什么。
答案 1 :(得分:1)
如果是同一个会话,为什么不这样做 你只需将会话ID转移为 用户移动时的GET参数 一页到另一页? - @Daff
@Daff,如果你在这里添加答案,我会修改并选择它作为答案
答案 2 :(得分:-2)
您可以覆盖会话处理程序,使其将会话数据保存在您的不同网站共享的数据库中。 然后,您必须在每台服务器上设置具有相同会话ID的会话cookie。 您必须使用session_set_save_handler并制作类似的内容:
/**
* @desc function used to open sessions
* @param string session path
* @param string session id
* @return bool
*/
function xx_session_open($path, $id){
return true;
}
/**
* @desc used when closing a session
* @return bool
*/
function xx_session_close(){
return true;
}
/**
* @desc saves session data
* @param string session id
* @param string session data
* @uses xx_crypt
* @return bool
* @global object PDO instance
*/
function xx_session_write($id, $data){
global $db;
$crypted = xx_crypt($data);
// Saves data into db
$sql = 'REPLACE INTO sessions (`ID`, `data`, `lastUsed`, `IV`) VALUES(:id, :data, NOW(), :iv)';
$sth = $db->prepare($sql);
$sth->execute(array(':id'=>$id, ':data'=>$crypted[0], ':iv'=>$crypted[1]));
return true;
}
/**
* @desc gets session data
* @param string session ID
* @return string
* @global object PDO instance
* @uses xx_decrypt
*/
function xx_session_read($id){
global $db;
$sql = 'SELECT `data`, `IV` FROM sessions WHERE `ID`=:id';
$sth = $db->prepare($sql);
$sth->execute(array(':id'=>$id));
list($crypted, $iv) = $sth->fetch();
$data = xx_decrypt($crypted, $iv);
return $data;
}
/**
* @desc destroys a session
* @param string session ID
* @return bool
* @global object PDO instance
*/
function xx_session_destroy($id){
global $db;
$sql = 'DELETE FROM sessions WHERE `ID`=:id';
$sth = $db->prepare($sql);
$sth->execute(array(':id'=>$id));
return true;
}
/**
* @desc delete old sessions
* @param int session lifetime (in seconds)
* @return bool
* @global object PDO instance
*/
function xx_session_gc($lifetime){
global $db;
$sql = 'DELETE FROM sessions WHERE `lastUsed` < :limit';
$sth = $db->prepare($sql);
$sth->execute(array(':limit'=>date('Y-m-d H:i:s',time() - $lifetime)));
return true;
}
// Set session handler
session_set_save_handler("xx_session_open", "xx_session_close", "xx_session_read", "xx_session_write", "xx_session_destroy", "xx_session_gc");
如果你想要的只是一个单一登录机制,你可以检查为此做出的Kerberos协议。