用ajax重定向后,php会话丢失了

时间:2017-05-30 22:52:01

标签: javascript php ajax

我有一个index.html登录页面,其中附有一个名为index.js的JavaScript页面。这两个文件在我的电脑上是本地的。 在index.js中,我有一个ajax调用,它使用名为index.php的页面验证用户名和密码,该页面位于Web服务器上。 在index.php中,我启动会话并检查用户名和密码的验证,并回显结果。如果成功,我会重定向到服务器上的event.html页面。 问题是尽管index.php和event.html位于同一个Web服务器上,但会话仍未传递。我在hindex.html和events.html

上看到了两个不同的会话cookie

index.js:

$.ajax({
        type:'POST',
        url:"http://example.com/index.php",
        beforeSend: function(xhr){
                xhr.withCredentials = true;
        },      
        data:$('#LoginForm').serialize(),
        success:function(response){  
            response = response.replace(/(\r\n|\n|\r)/gm,"");
            alert(response);
            if(response == "client logged in")
               window.location.href = http://example.com/events.html';
        },
        error:function(xhr, status, error){
            var t = JSON.stringify(xhr);
            alert(t);
        }
});

的index.php:

<?php
include 'head.php';
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type');
header("Access-Control-Allow-Credentials: true");

error_reporting(0);
if(isset($_POST['username']) &&isset($_POST['password']))
{
    $username=$_POST['username'];
    $password=$_POST['password'];
    if(!empty($username) && !empty($password))
    {
    $query="SELECT user_id
            FROM users
            WHERE username='$username' AND password='$password' ";
    $run_query=mysqli_query($conn,$query);
}
write_to_ses('user_id',$user_id);
echo "client logged in";
?>

head.php:

<?php
if(session_status() == PHP_SESSION_NONE) 
{
  session_start();
}
header('Access-Control-Allow-Origin: *');
error_reporting(0);

function write_to_ses($session, $data)
{
    $_SESSION[$session]=$data;
}
function read_from_ses($session)
{
   $user_id = $_SESSION[$session];
   return $user_id;
}
?>

修改 这可能是跨域问题吗?因为我正在从本地html转移到服务器上的html页面,尽管所有的php文件都在服务器上。

EDIT2: 我正在从本地html转移到服务器html。那么index.php可能会停止会话,并且events.php会开始一个新会话吗?

EDIT3: 刚刚将events.html传递给我的电脑,所以没有从客户端移动到服务器html。还是行不通。相同的域和相同的路径两个PHP文件和两个不同的会话而不是一个。

Edit4: 我删除了所有标题。从我的电脑运行index.html时,它给了我这个错误:&#34; XMLHttpRequest无法加载https://example.com/index.php。 No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; null&#39;因此不允许访问。&#34;

1 个答案:

答案 0 :(得分:1)

即使您尚未启动会话,也会设置<_> $ _ SESSION(尽管为空),因此使用!isset($ _ SESSION)将始终返回FALSE。

将您的代码更改为:

if(session_status() == PHP_SESSION_NONE) 
{
    session_start();
}