2017-04-25 143 views
1

有一個奇怪的問題,當從js(localhost)做ajax請求時會話沒有被存儲。Ajax和PHP會話問題,簡單的測試不會工作

我創建了一個簡單的演示程序,我期望能夠工作,但會話永遠不會被存儲。但是,如果我直接從我的瀏覽器訪問php腳本,它按預期工作並存儲會話。

HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
    <meta charset="utf-8" /> 
    <script src="js/jquery-1.8.0.min.js"></script> 
</head> 
<body> 

<script type="text/javascript"> 
    $(function(){ 
     $.ajax({ 
      dataType: 'json', 
      url: 'http://example.com/test.php', 
      method: 'GET', 
      success: function(response) { 
       console.log(response); 
      }, 
      error: function(error) { 
       console.log(error); 
      } 
     }); 
    }); 
</script> 

</body> 
</html> 

PHP:

<?php 

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

/* Session start */ 
session_start(); 

/* Set headers */ 
header('Access-Control-Allow-Origin: *'); 
header('Content-Type: application/json'); 

if (!isset($_SESSION['test'])) { 
    $_SESSION['test'] = 'abc'; 
    $result = 'session_set'; 

} else { 
    $result = $_SESSION['test']; 
} 

echo json_encode(array('result' => $result)); 

?> 
+0

檢查控制檯和你的PHP腳本中的錯誤。 – Jer

+0

沒有PHP錯誤,沒有JS控制檯錯誤。檢查php日誌文件並嘗試添加'ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(E_ALL);'到php腳本的頂部。 Allways返回「session_set」。 –

+0

您正試圖在頁面加載時調用'ajax'。所以使用'$(function(){... //你的ajax方法.... //})' –

回答

0

有跨域限制,心不是有問題嗎?

+1

'header('Access-Control-Allow-Origin:*');'應該解決這個問題嗎? –

+0

取決於。我認爲你不能在www.site-one.com上創建會話,從www.site-two.com呼叫它。頭('Access-Control-Allow-Origin:*');啓用ajax來調用site-one.com。 – Honzy

+0

我以前做過。創建了一個混合移動應用程序,使用PHP後端,我登錄,它存儲會話正確,一切正常。這就像3 - 4年前。 –

0

首先,檢查您的瀏覽器是否從AJAX請求服務器上收到Set-Cookie標頭。

其次,檢查瀏覽器是否正在存儲cookie並將它發送給後續請求,並且您沒有從服務器獲得任何新的Set-Cookie響應。

如果上述任何一條語句都是錯誤的,服務器配置可能會有問題,例如會話ID設置爲存儲在URL中 - 這顯然不起作用。

很抱歉地說出來,但它在本地主機上對我來說很流行。


如果您正在嘗試跨域,那麼這是不可能的,因爲跨域cookie不存在。

+0

是的,如果兩個文件都在本地主機上,它會工作。但我想做一個跨域請求。 php文件在example.com上,而js在localhost上運行。 –

+0

哦,對不起,可能是誤解了這個問題。將修改。 – Somrlik