2015-07-01 2 views
18

Я вошел в систему на Banana.com. Банан имеет ссылку api на /app/ajax_loggedin.Почему идентификатор сеанса изменяется при запросе через ajax в php?

Мой сайт - обезьяна. Обезьяна запускает простой GET json для банана /app/ajax_loggedin, который возвращает значение loggedin 1 или 0.

Почему он всегда возвращает 0, когда он проходит через ajax, хотя я действительно вошел в систему на банане, а также при доступе к ссылке напрямую дает мне 1. Как разработчик в Банане может это исправить?

Я бы это понял, если это вызов на стороне сервера, но я не понимаю, почему он не скажет мне, если я вошел в систему, если Банана делает запрос. Запуск session_id() check, он генерирует новый каждый вызов через ajax, и при непосредственном доступе он работает просто отлично и сохраняет то же самое.

Есть ли какое-либо исправление или другой способ сделать это?

+0

Похоже разработчика в Banana нужно хранить сессии (со значением таймаута) в таблице. Затем он может запросить таблицу и указать, все ли вы вошли в систему. – Jordan

+0

Как это решит решение? И не зная, какой пользователь в конце обезьяны. Они просто хотят знать, вошли ли они в Banana или нет. – Karem

+0

Очевидно, вам нужно было бы установить его, чтобы принять параметр (userid), чтобы указать, что вошел в систему. – Jordan

ответ

8

Каждая точка входа или вызов сервера (API) должна иметь в начале session_start(). Если он не читается в идентификаторе сеанса, он будет действовать так, как будто его не было, а затем возвращает новый идентификатор сеанса. Когда ваш браузер получит ответ, он перезапишет идентификатор сеанса новым. Убедитесь, что у вас есть session_start() наверху всех мест, где вы звоните на сервер, чтобы он знал, какую сессию использовать.

+0

Это неправда, это зависит от версии PHP, которую вы используете. – kayleighsdaddy

+1

Я заинтригован. Можете ли вы предоставить ссылку или пример? Если я ошибаюсь, я хотел бы узнать что-то новое. –

+0

Я предполагаю, что я Если вы используете session_start, вы получаете сообщение об ошибке. Сорренто исправлено, это параметр в файле ini, нужно ли вам использовать session_start или нет. Я просто знаю, что многие из серверов, на которых я программирую, если вы используете session_start, вы получаете ошибку. Я пропустил голос, это не позволит мне снять это. – kayleighsdaddy

4

Причины, почему вы получите новый идентификатор сессии являются

  • Вы очистили идентификатор сеанса куков (обычно с именем PHPSESSID)
  • Вы посетили страницу, называемую session_regenerate_id() (маловероятную)
  • Вашей сессию ударил по max lifetime и был garbage collected. Это отличная возможность, если banana.com имеет много посетителей, потому что мусор собирает случайно, когда PHP вызывается
  • session_id() был вызван с другой сессией

Так что же делать?

  • Проверьте файлы сеанса на сервере. Это простой текст, поэтому вы можете открыть их и посмотреть, что внутри. Убедитесь, что сеанс существует.
  • Проверьте php.ini на короткое время сеанса.
  • Загрузите сеансы во что-то еще и посмотрите, продолжаете ли вы. Использование системы MySQL/memcached с custom session handler может выявить проблемы.
5

На самом деле информации недостаточно, чтобы окончательно ответить на этот вопрос. Однако, вот что мы можем сказать на основе этой информации.

Если вы используете стандартный обработчик сеанса PHP, в cookie сеанса будет находиться связанный с ним домен (который, если он не настроен в php.ini или в вашем коде, скорее всего, будет доменом, который был вызван первым скриптом из).Например, если вы вызываете скрипт, который вызывает session_start() из домена www.stackoverflow.com, а другой скрипт на chat.stackoverflow.com начинает сеанс, у него не будет доступа к файлу cookie с доменом www.stackoverflow.com и, таким образом, он начнет новый сеанс.

Домены в заголовке файла cookie могут пузыриться, но не вниз. Поэтому, если вы хотите, чтобы ваш куки-файл сеанса имел доступ ко всем поддоменам Banana.com, вы должны обязательно установить параметр домена правильно в каждом запросе инициализации сеанса с этим доменом.

См session_set_cookie_params и session_get_cookie_params для получения более подробной информации ...

домена, печенье доступно. Настройка домена на «www.example.com» сделает файл cookie доступным в субдомене www и более высоких поддоменах. Файлы cookie, доступные для более низкого домена, такие как example.com, будут доступны для более высоких субдоменов, таких как «www.example.com». Старые браузеры, все еще реализующие устаревшие »RFC 2109, могут потребовать ведущих. для соответствия всем поддоменам.

Кроме того, следует отметить, что печенье отправляется с параметром безопасной или http_only значение ИСТИНА не будет читаться через небезопасные или JavaScript инициировал такие соединения, как и в случае Ajax.

2

Вместо вызова api и проверки активности сеанса. Идентификатор сессии хранится в куки, если указано, где хранится идентификатор сессии в конфигурационном файле, или вы можете проверить, если идентификатор сеанса устанавливается с помощью следующего кода после

session_start();  
$session_id=session_id();  
if(isset($_SESSION[$session_id])) 
Смежные вопросы