2016-06-19 2 views
1

Я создаю сайт, который как поддомен www.login.example.com основного сайта www.example.com. Когда пользователь входит в систему (из субдомена) имя пользователя и пароль передаются на главный сайт этого АЯКС сценария: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>

Почтовые данные принимаются и обрабатываются этим 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' 'Code' –

ответ

1

Идентификаторы сеансов передаются с использованием файлов cookie по умолчанию. Поскольку ваши веб-сайты находятся в разных доменах (субдомен - это другой домен), cookie сеанса не переносится, так что это одно, что предотвращает работу междоменных сессий.

Даже если файл cookie не является проблемой, вам необходимо будет иметь данные сеанса на каком-либо хранилище, обычно доступном вашим доменам. Вы можете использовать файловую систему или db для обмена данными сеанса.

Другим способом может быть добавление идентификаторов сеанса в строку запроса всех ваших запросов (у PHP даже есть определенная встроенная поддержка для этого). Тем не менее, этот способ делать вещи имеет много недостатков - самое главное, что люди копируют/вставляют URL-адреса все время, со всем, что подразумевает раскрытие действительного и повторного использования недействительных идентификаторов сеанса, и поэтому настоятельно не рекомендуется.

Лучше всего использовать Javascript для междоменных запросов по всем заинтересованным доменам (возможно, для реализации шаблона проектирования медиатора). Таким образом, вы можете легко переносить свой идентификатор сеанса на столько серверов, сколько вам нужно.

Редактирование: Помните, что для использования сессий на основе файлов cookie необходимо вызывать session_start() перед отправкой чего-либо в браузер, а также перед заголовком («Access-Control-Allow-Origin: *»);

+0

, но сеанс не передается субдомену. Страница субдомена получает имя пользователя и пароль от пользователя, затем передает их на сайт www.example.com, где обрабатывает данные и создает сеанс. –

+0

Сеанс используется только на веб-сайте [www.example.com] и не используется ни в одном другом поддомене. –

+0

. Каково значение $ sessionid из времени, в строке $ _SESSION ["sessionid"] = $ sessionid; ? –