2016-06-19 391 views
1

我正在創建一個網站,作爲主站點的子域www.login.example.comwww.example.com。當(從子域),用戶登錄的用戶名和密碼由該AJAX腳本傳遞到主站點:PHP和Jquery Ajax不會啓動會話

<script> 
 

 
    var xmlhttp; 
 

 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
 
     xmlhttp=new XMLHttpRequest(); 
 
    } 
 

 
    else{// code for IE6, IE5 
 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
 
    } 
 

 
    function loginano() { 
 

 
     var div= document.getElementById('thes').value; 
 
     var username = document.getElementById('username').value; 
 
     var password = document.getElementById('password').value; 
 

 
     xmlhttp.open('POST', "https://example.com/sess.php", true); 
 

 
     xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
 

 
     xmlhttp.send('username='+username+'&password='+password); 
 

 
     xmlhttp.onreadystatechange=function() { 
 

 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
 

 
       var resp = JSON.parse(xmlhttp.responseText); 
 

 
       if(resp.status) { 
 
        div.innerHTML = "Great"; 
 
       }else { 
 
        div.innerHTML = "Nope";  
 
       } 
 
      }else{ 
 
        div.innerHTML = "Wait"; 
 
      } 
 
     } 
 
    } 
 

 
</script>

POST數據被接收和由該PHP代碼處理:

<?php 
 
header("Access-Control-Allow-Origin: *"); 
 
session_start(); 
 
$servername = "localhost"; 
 
$username = "username"; 
 
$password = "pass"; 
 
$dbname = "dbname"; 
 

 
$loginusername = $_POST["username"]; 
 
$loginpassword = md5($_POST["password"]); 
 

 
// Create connection 
 
$conn = new mysqli($servername, $username, $password, $dbname); 
 
// Check connection 
 
if ($conn->connect_error) { 
 
    die("Connection failed: " . $conn->connect_error); 
 
} 
 

 
$sql="SELECT * FROM tbl_users WHERE username='$loginusername' "; 
 

 
$result = $conn->query($sql); 
 

 
if ($result->num_rows > 0) { 
 
    // output data of each row 
 
\t 
 
    while($row = $result->fetch_assoc()) { 
 
          $sessionid = $row['id']; 
 
          $sessionuser = $row['username']; 
 
\t \t $userpassword = $row['password']; 
 
\t 
 
}} 
 
\t if($loginpassword == $userpassword){ 
 
$_SESSION ["sessionid"]= $sessionid; 
 
$_SESSION ["sessionuser"]= $sessionuser; 
 
$return_arr["status"]=1; 
 
} else { 
 
\t $return_arr["status"]=0; \t 
 
} 
 
echo json_encode($return_arr); // return value 
 
exit(); 
 
$conn->close(); 
 
?>

登錄作品它是成功的,但會議不會開始。我錯過了什麼或者可能是什麼問題?

+0

你怎麼知道會話沒有開始?任何錯誤?之後你會在哪裏獲得'$ _SESSION'? – Jeff

+0

它不啓動會話,因爲我寫了一個腳本來檢查會話,在這裏; –

+0

'code' <?php session_start(); (isset($ _ SESSION [「sessionid」])){ echo $ _SESSION [「sessionid」]。「kk」; } else { echo「nope」; } ?>'code' –

回答

1

默認情況下,會話ID傳遞使用Cookie。由於您的網站位於不同的域(子域是不同的域),因此會話cookie不會轉移,因此阻止跨域會話正常工作是一回事。

即使cookie不是問題,您需要在您的域通常可訪問的某些存儲上擁有會話數據。您可以使用文件系統或數據庫來共享會話數據。

另一種方法可能是將會話ID追加到所有請求的查詢字符串中(PHP甚至對此有一定程度的內置支持)。然而,這種做事方式有許多缺點 - 最重要的是人們隨時複製/粘貼URL,所有這些意味着揭示有效並重復使用無效會話ID - 因此強烈建議不要這樣做。

一個更好的方法是使用Javascript跨所有感興趣的域(可能實現中介設計模式)進行跨域請求。通過這種方式,您可以根據需要在任意多臺服務器上無縫傳輸會話標識。

編輯:請記住,要使用基於cookie的會話,必須在向瀏覽器發送任何內容之前調用session_start(),以便在標題(「Access-Control-Allow-Origin:*」)前也要調用session_start()。

+0

但會話沒有傳遞給子域。子域名頁面從用戶處獲得用戶名和密碼,然後將它們傳遞到www.example.com,在那裏處理數據並創建會話。 –

+0

該會話僅在網站[www.example.com]內使用,不與其他任何子域共享 –

+0

$ sessionid在此期間的價值是多少,在 $ _SESSION [「sessionid」] = $ sessionid; ? –