簡體   English   中英

PHP Session ID / Session variable value changing on every request from react axios / ajax call

[英]PHP Session ID / Session variable value changing on every request from react axios / ajax call

我剛剛開始使用 react js,並開始面臨一些客戶端系統的一些問題。 在將數據從 react js 發布到 php 文件時,使用(axios 或 ajax)session_id() 在每個請求/調用時重置和重新生成。 session 變量復位。 我已經嘗試了一些來自 stackoverflow 的解決方案,但沒有任何效果。我在我的本地主機和其他一些系統中遇到了這個問題。 但也可以與其他一些系統一起使用。 這就像使用 50% 的系統而不使用 50% 的系統。

但是,如果我做同樣的事情而沒有從正常的 html 文件與 ajax 到 php 文件反應 js。 session id 未重置或重新生成。

PHP 文件

<?php
session_start();
$session_val = session_id();
 header("Access-Control-Allow-Origin: *");

echo $session_val;

?>

AJAX 來自 REACT JS 的調用

$.ajax({
        url: "http://localhost/test.php",
        type: "POST",
        data: {
          action: action,
        },
        success: function (data) {
        },
        error: function (jqXHR, text, errorThrown) {
          console.log(jqXHR + " " + text + " " + errorThrown);
        },
      });

AXIOS 調用

    axios
    .post('http://localhost/test.php', this.state)
    .then(response =>{
        console.log(response.data);

    })
    .catch(
     error => {
        console.log(error)
    });

看起來您的瀏覽器沒有發送帶有 AJAX 請求的 Cookie header(他們默認這樣做,但我不知道為什么它不發送)。

當您的 PHP 服務器發現沒有 Cookie header 時,它假定未設置 SESSONID 並創建一個新的,並指示您的客戶端將新的 SESSIONID 存儲在其 Z55E7DD3016CE4AC57B2ZA 中。 由於這個新的 SESSIONID 不會在下一個請求中發送,因此您的服務器再次假設相同的事情,並再次創建一個新的 SESSIONID。 而且這個過程每次都會發生。

要了解有關 cookies 工作原理的更多信息,您可以參考使用 HTTP Cookies

您可以手動獲取 cookies 並將其作為 Header 添加到 AJAX 請求中,如 so:

$.ajax({
        url: "http://localhost/test.php",
        type: "POST",

        headers: {"Cookie": document.cookie},

        data: {
          action: action,
        },
        success: function (data) {
        },
        error: function (jqXHR, text, errorThrown) {
          console.log(jqXHR + " " + text + " " + errorThrown);
        },
      });

AJAX object 的headers屬性用於向您的 HTTP 請求添加額外的標頭。 在這里,我們獲取瀏覽器使用document.cookie存儲的 cookies 並將其添加到請求標頭中的Cookie header 中。

讓我知道這是否解決了您的問題。

根據Shreyas Sreenivas的評論,我使用xhrFields: { withCredentials: true }用於 ajax 和

axios.post('https://example.com/file.php', this.state,{withCredentials: true}); 對於 axios 並且它有效。 但是發生了一些跨域請求被阻止的錯誤,需要修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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