簡體   English   中英

在通過 JQuery/AJAX 跨域傳遞變量后,如何在 php 會話中保存它?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM