2017-04-25 205 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