2016-03-07 3 views
0

Когда я выполняю вызов AJAX, мне нужно дождаться его ответа, чтобы показать его пользователю.Обновить страницу во время вызова ajax уничтожает php-сессию

function update() { 
    if (HttpReq.readyState == 4) { 
     if (HttpReq.status == 200) { 
      var div = document.getElementById('divAjax'); 
      div.innerHTML = HttpReq.responseText; 
     } else { 
      alert("Error: " + HttpReq.statusText); 
     } 
    } 
} 

HttpReq = new XMLHttpRequest(); 
HttpReq.onreadystatechange = update; 
HttpReq.open('GET', 'some_url.php', true); 
HttpReq.send(null); 

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

Это обычное поведение, или есть проблема с моим кодом? (Я использую безопасный сеансовый загрузчик, возможно, проблема там. Я могу опубликовать код, если это необходимо.)

Проблема не совсем в F5, это то, что происходит в некоторых особых обстоятельствах, это просто Простейший способ я нашел, чтобы воспроизвести поведение.

Код:

// index.php 
ini_set('session.gc_maxlifetime', 3600); 
ini_set('session.gc_probability', 1); 
ini_set('session.gc_divisor', 100); 
session_save_path('/var/www/html/plantas/sessions'); 
sec_session_start(); // this line called in every other .php file 

// functions.php 
function sec_session_start() { 
    $session_name = 'sec_session_id'; // Set a custom session name 
    $secure = SECURE; 
    // This stops JavaScript being able to access the session id. 
    $httponly = true; 
    // Forces sessions to only use cookies. 
    if (ini_set('session.use_only_cookies', 1) === FALSE) { 
     header("Location: ../html/plantas/error.php?err=Could not initiate a safe session (ini_set)"); 
     exit(); 
    } 
    // Gets current cookies params. 
    $cookieParams = session_get_cookie_params(); 
    session_set_cookie_params($cookieParams["lifetime"], 
     $cookieParams["path"], 
     $cookieParams["domain"], 
     $secure, 
     $httponly); 
    // Sets the session name to the one set above. 
    session_name($session_name); 

    session_start();    // Start the PHP session 
    session_regenerate_id(true); 
} 

// every other .php file begin with 
include_once '../../includes/db_connect.php'; 
include_once '../../includes/functions.php'; 
sec_session_start(); 

РЕШЕНИЕ

сократить

session_regenerate_id(true); 

из functions.php и вставить его после

// index.php 
ini_set('session.gc_maxlifetime', 3600); 
ini_set('session.gc_probability', 1); 
ini_set('session.gc_divisor', 100); 
session_save_path('/var/www/html/plantas/sessions'); 
sec_session_start(); // this line called in every other .php file 
+0

Да, лучше показать весь задействованный код. –

+0

some_url.php проверить, что находится внутри этого запроса –

+0

в обычной сессии сценария закрывается только при закрытии браузера, если у вас нет проверок для кнопки «Назад» и обновления, что, похоже, не с тобой. так что да, совместное использование кода поможет. – akmsharma

ответ

1

session_regenerate_id() означает, что сеанс переименовывается каждый раз, когда URL-адрес вызывается полной загрузкой страницы или запросом Ajax. Но cookie сеанса не переопределяется во время запроса Ajax из-за http_only=true. И поскольку session_regenerate_id(true) удаляет старый сеанс, если между двумя загрузками полной страницы есть вызов Ajax, идентификатор сеанса теряется клиентом.

Вы не должны использовать session_regenerate_id($anything) во время вызова Ajax.

0

Согласно кодексу, у вас есть это line co de session_regenerate_id(true);, который делает именно то, чего вы не хотите, но почему?

Согласно documentation:

session_regenerate_id() заменит текущий идентификатор сессии с новым один, и сохранить информацию о текущей сессии.

но это не должно удалить вашу старую сессию, так что происходит? На самом деле вы устанавливаете параметр bool в true (по умолчанию false), который говорит препроцессор для удаления старой сессии заменить его новым одним

BOOL session_regenerate_id ([BOOL $ delete_old_session = ложь])

так решение вашей проблемы, чтобы удалить параметр true внутри нативного метода и держать его просто так: session_regenerate_id();

EDIT

Если этот запрос используется только в Ajax, то запуск или работа с сеансом является излишним. Если вы не проверяете аутентификацию пользователя перед выполнением запроса.

+0

В этом случае у одного пользователя несколько сеансов. Звучит не так, как хочет Родриго. Похоже, он хочет очень укрепить свои следы. –

+0

@ CWürtz Если он использует сеанс регенерации, это означает, что он нуждается в какой-либо цели, может быть, эта функция используется в другом месте, где это не ajax, это зависит от архитектуры его кода, а более конкретно, если это только ajax, тогда он не должен использовать сессию во всех функциях и удалять то, что остается в коде) –

+0

Yeap. В этом случае он мог бы прочитать, как использовать токен сеанса (клиентский сайт и серверная сторона). –

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