Я полагаю, что вы имеете дело с сеансом, информация о тайм-ауте которого хранится на стороне сервера (клиент не обязательно знает, когда его сеанс больше не будет действительным).Получите эту информацию и отправьте ее клиенту вместе с запросом.Простой setTimeout(notifySessionExpiration, sessTimeout * 1000)
сделает свое дело.
Чтобы ответить на второстепенные вопросы:
$ajax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
установит для $ajax
значение true, если вы имеете дело с запросом XML, предполагая, чтобраузер отправляет совместимые заголовки (что он обычно делает в наши дни).
Возможно, вы захотите изолировать часть кода, который отправляет 302 (возможно, контроллер всего приложения, который обрабатывает выборку личной информации пользователя на основев сеансе) и составить исключение, если $ajax
верно.Возможно, вы захотите отправить обратно 401 или 403, а затем сделать так, чтобы ваш обратный вызов Javascript отвечал на этот статус определенным образом (например, перенаправлял на страницу входа или предоставлял всплывающее наложение входа Ajax).
Если этоэто просто игрушечный сайт, и вы готовы испачкать руки, чтобы создать более надежное решение, я могу дать следующие рекомендации:
- Не используйте семантически вводящий в заблуждение детектор XHR: по моему мнению, доставка разного контента разным запросчикам вполне разумна, если это контент того же самого уровня с определенными адаптациями для запрашивающего (например, причуды браузера).Но когда конкретный запросчик выполняет принципиально другую функциональную роль (например, когда XHR отправляется в ожидании ответа JSON / XML по сравнению с тем, когда браузер отправляет обычный HTTP-запрос для HTML), тогда запрос не должен быть длятот же актив.На мой взгляд, лучшая практика - создавать HTML для
.html
или путей без расширений, например GET /mypage.html
или GET /mypage
, тогда как XHR-ориентированное содержимое должно иметь природу GET /mypage.json
или GET /mypage.xml
.Это не означает, что XHR не должен никогда получать HTML-ответ.Иногда это вполне уместно, например, когда вы загружаете фрагмент HTML для формы входа в систему или просто используете AJAX для переходов страниц. - Внедрите систему, чтобы поддерживать ваш сеанс: если вам нужно, чтобы ваш сеанс истекал только по времени, а не просто до тех пор, пока браузер не будет закрыт, затем выполните вызов на стороне клиента, чтобы обновить сеанс простым AJAX-запросом до его истечения (если страница закрыта,запрос не запускается, что позволяет сеансу истечь по истечении выделенного времени).