【问题标题】:php session lost after redirecting with ajax使用ajax重定向后php会话丢失
【发布时间】:2017-05-30 22:52:01
【问题描述】:

我有一个 index.html 登录页面,其中附加了一个名为 index.js 的 JavaScript 页面。这两个文件在我的电脑本地。 在 index.js 中,我有一个 ajax 调用,它使用位于 Web 服务器上的名为 index.php 的页面来验证用户名和密码。 在 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 文件都在服务器上。

编辑2: 我正在从本地 html 移动到服务器 html。所以也许 index.php 停止会话和 events.php 开始一个新会话?

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

编辑4: 我删除了所有标题。从我的电脑运行 index.html 时,它给了我这个错误:“XMLHttpRequest cannot load https://example.com/index.php. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' 因此不允许访问。”

【问题讨论】:

  • 您的代码容易受到 SQL 注入的影响,您需要修复此问题。您正在以明文形式存储密码,您还需要修复他的密码。
  • 这是一项正在进行的工作,而不是最终项目
  • 没关系,正确执行会极大地改变逻辑,因此仅按您的方式执行然后一次性解决所有问题是不可行的。
  • 会话没有传递到哪里?
  • 下一页是 events.html,它从 events.php 获取 ajax 信息,所有这些信息都位于 Web 服务器上。但 events.php 的会话 ID 与 index.php 不同

标签: javascript php ajax


【解决方案1】:

即使您还没有开始会话,$_SESSION 也会被设置(尽管为空),因此使用 !isset($_SESSION) 将始终返回 FALSE。

将您的代码更改为:

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

【讨论】:

  • 继续,这对于所有超全局数组都是一样的,$_GET$_POST$_SESSION$_COOKIE$_FILES...等。它们总是固定的。如果没有传递该特定数组的数据,则只是一个空数组。
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
相关资源
最近更新 更多