iPhone «Закладка на главном экране» удаляет куки и сеанс? - PullRequest
38 голосов
/ 28 сентября 2010

В данный момент я занимаюсь разработкой веб-приложения, в котором пользователь должен сначала войти в систему.

Когда я открываю страницу с помощью iPhone Safari, авторизируюсь и перезапускаю Safari, я все еще захожу (Cookie &Идентификатор сеанса по-прежнему установлен).

Но когда я добавляю эту страницу с помощью «Добавить на главный экран», каждый раз, когда я нажимаю значок для этой страницы, я должен снова войти в систему.

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

Ответы [ 4 ]

14 голосов
/ 31 декабря 2011

Действительно простым подходом может быть использование уникального токена в вашем Bookmark-URL, который может служить вам уникальным идентификатором устройства.

Пример: http://myWebApp.com/?token=randomId29238/1

Токен может быть создан на стороне сервера во время открытия приложения в Mobile Safari и до того, как пользователю будет предложено ввести информацию «Добавить на главный экран». Затем токен можно добавить к URL-адресу с помощью быстрого перенаправления (… & token = randomToken) или хэша местоположения (… # randomToken).

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

Чтобы разрешить будущие процедуры выхода из системы и входа в систему, вы всегда можете назначить новые сеансы токену.

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

12 голосов
/ 30 января 2013

Существует более простое и, на мой взгляд, более элегантное решение, чем у favo.

По крайней мере, в iOS 4.2.1, 5.1.1, 6.0 и 6.1 (я не смог протестировать другие версии), если вы продлите срок действия файла cookie сеанса вручную, Safari сохранит файл cookie сеанса и даже разрешит совместное использование сеанса между версией веб-приложения «установлен на домашний экран» и обычными посещениями через сам Safari.

Хитрость заключается в том, чтобы сделать это:

// Start or resume session
session_start(); 

// Extend cookie life time by an amount of your liking
$cookieLifetime = 365 * 24 * 60 * 60; // A year in seconds
setcookie(session_name(),session_id(),time()+$cookieLifetime);

Для более подробного обсуждения этой стратегии вы можете взглянуть на мой ответ на этот вопрос:

Поддержка PHP-сессии в веб-приложении на iPhone

4 голосов
/ 20 ноября 2016

Я собираюсь немного подробнее рассказать об ответе Уолдо Бэггинса.

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

Когда пользователь использует ваш сайт в режиме веб-приложения (значок добавлен на главный экран), iOS обрабатывает переход к приложению и из него так же, как настольный компьютер будет относиться к закрытию и повторному открытию браузера, и теряет сеанс при повторном открытии. .

Таким образом, следуя предложению Уилбо и установив время истечения для файла cookie, iOS проверяет, истек ли срок действия файла cookie, когда пользователь переходит обратно к вашему приложению, и, если это не так, повторно отправляет файл cookie, тем самым поддерживая сеанс. Значение 1 года в ответе Уилбо является смехотворно длинным, обычно вы хотите установить его равным 8 или 24 часам и в идеале синхронизировать его со значением времени ожидания истечения сеанса, которое вы установили на сервере.

Обратите внимание, что в качестве побочного эффекта, когда к вашему сайту обращаются из браузера на рабочем столе, а пользователь закрывает и снова открывает браузер, сеанс будет продолжать сохраняться, и пользователь все равно будет входить в систему, что не будет были случаи ранее (если они не просматривали в частном порядке). Ваша функция выхода из системы должна правильно обрабатывать истекающий срок действия этого файла cookie.

Для веб-приложения Java, использующего web.xml версии 3.0 или выше, самый простой способ сделать это - изменить <session-config> следующим образом:

<session-config>
    <session-timeout>600</session-timeout> <!-- In minutes -->
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
        <max-age>36000</max-age> <!-- In seconds -->
    </cookie-config>
</session-config>
3 голосов
/ 04 октября 2010

Для веб-приложений доступно постоянное хранилище значений ключей и баз данных. Вы можете сохранить свои данные аутентификации, используя объект localStorage и использовать XMLHttpRequest для отправки их на сервер. Другим вариантом является сохранение ваших постоянных данных в базе данных SQLite, однако в вашем случае это не кажется правильным решением. Обратитесь к руководству Apple по хранению и автономным приложениям на стороне клиента для получения подробной информации / примеров.

...