2017-05-30 70 views
1

我有一個index.html登錄頁面,其中附帶一個名爲index.js的JavaScript頁面。這兩個文件在本地電腦上。 在index.js中,我有一個ajax調用,它使用名爲index.php的頁面對位於Web服務器上的用戶名和密碼進行身份驗證。 在index.php中,我啓動會話並檢查用戶名和密碼的身份驗證並回顯結果。如果成功,我將重定向到服務器上的event.html頁面。 問題是雖然index.php和event.html位於同一個Web服務器上,但會話未被傳遞。我看到在hindex.html和events.html重定向到ajax後php會話丟失

index.js兩個不同的會話cookie:

$.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無法加載https://example.com/index.php。請求的資源中沒有'Access-Control-Allow-Origin'標頭,因此不允許Origin'null'訪問。

+0

您的代碼容易受到SQL注入,就需要解決這個問題。你以明文存儲密碼,你還需要修復他的密碼。 – Enstage

+0

這是一項正在進行的工作,不是最終的項目 – t1a2l

+0

無關緊要,正確地大幅改變邏輯,所以按照您的工作方式進行修改並不可行,然後一次性修復。 – Enstage

回答

1

即使您尚未啓動會話,也會設置$ _SESSION(儘管爲空),因此使用!isset($ _ SESSION)將始終返回FALSE。

更改您的代碼:

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

爲了繼續,所有超全局數組,'$ _GET','$ _POST','$ _SESSION','$ _COOKIE','$ _FILES'等都是相同的。他們總是被設置。如果沒有傳遞特定數組的數據,則只需要一個空數組。 –

+0

這個dosn't沒有解決問題。 – t1a2l