Я знаю, что это распространенная проблема, и я столкнулся с ней раньше и смог ее исправить, но я не могу понять, что это нужно, поэтому мне нужно немного дополнительные наборы глаз/мозгов, пожалуйста.
Вот точный сценарий, я был свидетелем во время пошагового с помощью отладчика:
[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 »");
}
}).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"));
});
});
Может быть, это anwser может помочь вам: http://stackoverflow.com/questions/1745984/php-session-use-trans-sid –