我一直在为我的案子寻找任何解决方案,但我还没有找到它。因此我决定分享我的解决方案。
CASE
我想在域之间共享一些用户信息。这意味着我想获取上周已访问过 web1.com 的用户的所有收集信息,并立即访问 web2.com 。该用户是第一次访问 web2.com ,但我已经知道他是谁。
答案 0 :(得分:0)
<强> SOLUTION:强>
<强>要求:强>
PHP服务器http://cookie-server.local index.php :
<?php
$hash = array_key_exists('my-cookie', $_COOKIE) ? $_COOKIE["my-cookie"] : NULL;
try {
$connection = new PDO("pgsql:dbname=cookie;host=localhost", 'postgres', 'postgres');
$data = findHash($connection, $hash);
if ($data) {
setcookie('my-cookie', $data['hash'], strtotime("+1 year"));
sendResponse($data);
} else {
$hash = generateHash();
$data = storeHash($connection, $hash);
setcookie('my-cookie', $hash, strtotime("+1 year"));
}
} catch (PDOException $e) {
echo $e->getMessage();
die();
}
function findHash($connection, $hash) {
$sql = 'SELECT * from cookie WHERE hash = :hash';
$stm = $connection->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$stm->execute(array(':hash' => $hash));
$result = $stm->fetchAll(PDO::FETCH_ASSOC);
if ($result === FALSE) {
printError($stm->errorInfo());
}
return count($result) > 0 ? $result[0] : NULL;
}
function sendResponse($data) {
header('Content-Type: text/javascript; charset=utf8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Max-Age: 3628800');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
echo 'showData('. json_encode($data) .');';
}
function printError($error) {
echo 'SQL error: ' . $error[2];
die();
}
function generateHash() {
return $hash = md5(uniqid(mt_rand(), TRUE));
}
function storeHash($connection, $hash) {
$sql = "INSERT INTO cookie (id, hash) VALUES (nextval('cookie_id_seq'), :hash)";
$stm = $connection->prepare($sql);
$result = $stm->execute(['hash' => $hash]);
if ($result === FALSE) {
printError($stm->errorInfo());
}
return [
'id' => $connection->lastInsertId(),
'hash' => $hash,
'name' => ''
];
}
?>
web1.com上的基本网页(JS代码无处不在,您需要知道有关用户的信息)
<html>
<body>
WEB 1:<br> <span id="hash"></span>
</body>
<script type="text/javascript">
function showData(data) {
document.getElementById('hash').innerHTML = "<br>ID: " + data.id + "<br>Hash: " + data.hash + "<br>Jmeno: " + data.name;
}
var script = document.createElement("script");
script.type = 'application/javascript';
script.src = "http://cookie-server.local";
document.getElementsByTagName("head")[0].appendChild(script);
</script>
<script type="text/javascript" src="http://cookie-server.local">
</html>
<强>数据库:强>
如何运作?
当用户访问 web1.com 时,JS代码执行并包含
<script type="text/javascript" src="http://cookie-server.local">
页头元素。浏览器尝试下载文件内容并在服务器上执行PHP代码。服务器查看传递的cookie并发现没有 my-cookie 。因此,它生成cookie哈希,将其存储在数据库中,将其设置为用户(cookie名称为&#34; my-cookie&#34;对于域cookie-server.local)并使用JSONP发送用户数据。对于服务器的另一个请求,它在数据库中找到先前生成的哈希值,并且只延长到期时间并确保发送用户数据。从现在开始,当这个用户使用JS代码打开任何其他网页(web2.com ...)时,你知道它是谁。