[英]How do I make a cross-domain Ajax call to remote server passing through local PHP file
[英]How do I save a variable in php session after passing it cross domain via JQuery / AJAX?
好的,這是交易。
我有兩個域。 域 1 托管一個帶有登錄會話的主網站,域 2 托管一個聊天。
到目前為止,當登錄域 1 時,聊天鏈接是可見的。 當單擊域 1 上的鏈接時,在進入域 2 之前會發生一些事情。域 1 通過 AJAX 帖子將所需信息傳遞到域 2 上的 pass.php。 域 2 接收這些變量,將它們保存到會話並向域 1 返回一條消息“ok”。如果域 1 收到一條等於“ok”的消息,則表示會話已保存並轉到域 2。否則,打印一條錯誤消息說聊天無法加載。
域之間的數據交換正在工作,域 2 返回“ok”消息,但是當頁面“index.php”加載並啟動會話時,保存的會話變量為空。 就好像變量在 AJAX 傳輸之后在另一端被擦除一樣。 我想在進入該頁面后保留會話變量中存儲的內容,以便我可以相應地使用從域 1 傳遞到域 2 的會話變量。
這是域 1 的代碼:
<ul class="dropdown-menu">
<li style="text-align:center;"><a href="member.php">Edit Profile</a></li>
<li style="text-align:center;"><a href="profile.php?user=<?php echo $username; ?>">View Profile</a></li>
<li style="text-align:center;"><a href="inbox.php?page=1">Messages</a></li>
<li style="text-align:center;"><a class="loadlink" id="chatclick" href="#">Chat</a></li>
</ul>
<script type="text/javascript">var name = "<?= $username ?>";</script>
<script type="text/javascript">var id = "<?= $userid ?>";</script>
<script src="/js/menuscript.js"></script>
這是菜單腳本文件客戶端域 1:
$(document).ready(function()
{
"use strict";
$('.loadlink').click(function(e){
e.preventDefault();
var lnk = 'http://52.39.48.172/index.php?test=test';
$.ajax({
url:"http://52.39.48.172/bin/pass.php",
data:"name="+name+"&id="+id,
type:"POST",
dataType:"json",
contentType:"application/json; charset=utf-8",
success:function(data)
{
if(data.callback == "ok")
{
window.location.href = lnk;
}
else
{
alert("ERROR: could not connect to chat");
}
}
});
});
});
這是域 2 上 pass.php 的代碼
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
error_reporting(E_ALL ^ E_NOTICE);
session_start();
if(isset($HTTP_RAW_POST_DATA)) {
parse_str($HTTP_RAW_POST_DATA,$arr);
$_SESSION["username"] = $arr['name'];
$_SESSION["userid"] = $arr['id'];
$arr2['callback']= "ok";
echo json_encode($arr2);
}
else
{
$arr2['callback']= "nogo";
echo json_encode($arr2);
}
?>
最后:這是域 2 的 index.php
<?php
error_reporting(E_ALL ^ E_NOTICE);
session_start();
$userid = $_SESSION["userid"];
$username = $_SESSION["username"];
if(!$username)
die("dead");
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Ram Chat</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="container">
<div class="chat" id="chatwindow"></div>
<div class="form">
<textarea name="message" id="messagebox" placeholder="Message: "><?php echo $username; ?></textarea>
</div>
</div>
<script src="js/app.js"></script>
</body>
</html>
現在,當我們從域 1 切換到域 2 時,我們在 index php 上點擊了“die("dead")”函數,因為會話變量沒有設置,而它應該來自之前的 CORS 通信。 相反,會話變量保持為空。 當 index.php 在域 2 上加載時,新保存的變量會出現在“textarea”中。
誰能解釋一下我做錯了什么以及我應該如何解決它?
我相信在 pass.php 中開始的會話和在 index.php 中的會話是兩個不同的會話。 我不能確定,因為我現在沒有辦法嘗試它,但我已經給出了一個可能的解決方案,如果它對你有用,請嘗試並報告。 :)
通過.php
//...
if(isset($HTTP_RAW_POST_DATA)) {
parse_str($HTTP_RAW_POST_DATA,$arr);
$_SESSION["username"] = $arr['name'];
$_SESSION["userid"] = $arr['id'];
$arr2['callback']= "ok";
$arr2['sessid'] = session_id();
echo json_encode($arr2);
}
//...
阿賈克斯
$.ajax({
url:"http://52.39.48.172/bin/pass.php",
data:"name="+name+"&id="+id,
type:"POST",
dataType:"json",
contentType:"application/json; charset=utf-8",
success:function(data)
{
if(data.callback == "ok")
{
window.location.href = lnk+"?sessid="+data.sessid;
}
else
{
alert("ERROR: could not connect to chat");
}
}
});
});
索引.php
session_id($_GET['sessid']);
session_start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.