2013-08-31 2 views
0

Я знаю, что это распространенная проблема, и я столкнулся с ней раньше и смог ее исправить, но я не могу понять, что это нужно, поэтому мне нужно немного дополнительные наборы глаз/мозгов, пожалуйста.

Вот точный сценарий, я был свидетелем во время пошагового с помощью отладчика:

[home page load] 
Session::Load() 
$session_uid = (new) d149f... 
$row = false 

[login page load] 
Session::Load() 
$_COOKIE['x'] (found/existing) d149f... 
$session_uid = d149f... 
$row = data 

$_COOKIE['x'] d149f... 

[login page login submit] // <--- submitted via Ajax code above 
Session::Load() 
$_COOKIE['x'] == null // <--- Here's the problem 
$session_uid = (new) 4bd87... 
$row = false 

$_COOKIE['x'] d149f... (original) 
+ 
$_COOKIE['x'] 4bd87... (new created from ajax post) 

Если я использую JQuery ниже, чтобы отправить регистрационную форму с помощью AJAX сервер не видит существующий $_COOKIE['x'] при обращении с должности, что приводит к тому, что наш обработчик сеансов не распознает посетителя и не создаст новый сеанс, а добавит еще один $_COOKIE['x'] в браузер.

Без использования AJAX сервер правильно считывает $_COOKIE['x'] браузера и распознает посетителя. Домен и путь файла cookie выглядят правильно, я тоже не делаю кросс-доменных запросов.

PHP код, который работал на каждом запросе ниже. Я запустил xdebug и выполнил запрос, и он действительно правильно проходит код в обоих браузерах и AJAX-запросах, только запрос AJAX возвращает $_COOKIE['x']: null создает новый сеанс.

if (empty($_COOKIE['x'])) { // new sess

Войти код формы AJAX:

$('#btnLogin').on("click", function() { 
    console.debug('Click'); 
    // Btn 
    var btn = $(this); 
    // Form data 
    var frm = $('#' + btn.val()); 
    // Validate 
    if (!frm.valid()) { 
     return false; 
    } 
    btn.prop('disabled', true).html('Please wait...'); 
    var frmData = frm.serializeArray(); 

    // Ajax execute 
    var go = $.ajax({ 
     type: 'POST', 
     url: '<?php echo CONTROLLER; ?>/ajax', 
     dataType: 'json', 
     data: frmData 
    }).done(function(results) { 
     console.debug('Done'); 
     console.debug(results); 
     // Handle Results 
     if (results['status'] === 'OK' 
       && results['message']['status'] === 'active') 
     { 
     $('#user_login_results').html("<span class='alert alert-success'>Success! Click <a href='#' onClick='document.location.reload(true)'>here</a> to reload.</span><p></p>"); 
     btn.html('Success!'); 
<?php 
$return = 'login'; 
if (!empty($_REQUEST[ 'return' ])) { 
    $return = htmlentities($_REQUEST[ 'return' ]); 
} 
?> 

     location.href = '<?php echo CONTROLLER; ?>/en/<?php echo $return; ?>'; 
     } 
     else 
     { 
     console.debug(results); 
     $('#user_login_results').html("<span class='alert alert-error'>Please check your username and passphrase and try again.</span><p></p>"); 
     btn.prop("disabled", false).html("Try Again &raquo;"); 
     } 
    }).fail(function(msg) { 
     // Error results 
     console.debug(msg); 
     $('#user_login_results').append("<span class='alert alert-error'>Error! Please try again later.</span><p></p>"); 
     btn.html('Error!').removeClass('btn-primary').addClass('btn-danger'); 
    }).always(function() { 
     $("body").scrollTop($("#result")); 
    }); 
    }); 
+0

Может быть, это anwser может помочь вам: http://stackoverflow.com/questions/1745984/php-session-use-trans-sid –

ответ

0

Хорошо, так что я предполагаю, что это был Путь setcookie после всего, изменяя его от значения по умолчанию для «/» явно немедленно исправили проблему.

Старый: setcookie($cookie_name, $session_uid);

Новое: setcookie($cookie_name, $session_uid, time()+60*60, '/');

Смежные вопросы