现在我正在开发一个基于 Web 的应用程序,用户必须先登录。
当我通过 iPhone Safari 打开页面,登录并重新启动 Safari 时,我仍然处于登录状态(Cookie 和会话 ID 仍然设置)。
但是,当我使用“添加到主屏幕”添加此页面时,每次单击该页面的图标时,我都必须再次登录。
我没有找到任何相关信息。我该怎么做才能让我的用户将此页面设置为他们的主屏幕作为图标,并且每次打开它时仍然不必登录?
现在我正在开发一个基于 Web 的应用程序,用户必须先登录。
当我通过 iPhone Safari 打开页面,登录并重新启动 Safari 时,我仍然处于登录状态(Cookie 和会话 ID 仍然设置)。
但是,当我使用“添加到主屏幕”添加此页面时,每次单击该页面的图标时,我都必须再次登录。
我没有找到任何相关信息。我该怎么做才能让我的用户将此页面设置为他们的主屏幕作为图标,并且每次打开它时仍然不必登录?
一个非常简单的方法可能是在您的书签 URL 中使用唯一令牌,它可以作为唯一的设备标识符。
示例: http ://myWebApp.com/?token=randomId29238/1
可以在 Mobile Safari 中打开应用程序时以及在提示用户“添加到主屏幕”信息之前在服务器端生成令牌。然后可以使用快速重定向 (...&token=randomToken) 或位置哈希 (...#randomToken) 将令牌添加到 URL。
每当现在从主屏幕打开书签时,令牌都会发送到您的服务器,您可以识别用户的活动会话。您也可以将令牌用作永久会话 ID,但出于安全考虑,我建议您不要这样做。
要允许将来的注销和登录过程,您始终可以将新会话分配给令牌。
每当用户从其主屏幕重新打开您的链接时,该令牌将为您提供唯一的设备标识符。
有一个比 favo 更简单、更优雅的解决方案。
至少在 iOS 4.2.1、5.1.1、6.0 和 6.1(我无法测试其他版本)下,如果您手动延长会话 cookie 的生命周期,Safari 将保留会话 cookie 甚至允许共享Web 应用程序的“已安装主屏幕”版本与通过 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);
有关此策略的更详细讨论,您可以查看我对这个问题的回答:
我将进一步扩展 Waldo Baggins 的回答。
当我遇到这个问题时,我发现发生这种情况的原因是服务器上设置的会话 cookie 通常没有设置过期值。在这种情况下,默认行为是浏览器在关闭/重新打开浏览器时丢弃 cookie。由于浏览器在重新打开时不会重新发送 cookie,服务器无法识别会话,即使它在服务器上尚未过期,因此,您的用户将被重定向回登录页面。
当用户在 Web 应用程序模式下使用您的网站时(图标添加到主屏幕),iOS 将导航到/从应用程序处理与台式计算机处理关闭和重新打开浏览器的方式相同,并在重新打开时丢失会话。
因此,按照 Wilbo 的建议并为 cookie 设置过期时间,iOS 在用户导航回您的应用程序时检查 cookie 是否已过期,如果尚未过期,则重新发送 cookie,从而维持会话。Wilbo 的答案中 1 年的值非常长,您通常希望将其设置为 8 或 24 小时,理想情况下将其与您在服务器上设置的会话到期超时值同步。
请注意,作为副作用,当从桌面浏览器访问您的站点时,用户关闭并重新打开浏览器时,会话将继续存在并且用户仍将登录,这不会是以前的案例(除非他们私下浏览)。您的“注销”功能必须正确处理此 cookie 的过期问题。
对于使用 web.xml 3.0 或更高版本的 Java webapp,最简单的方法是进行<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>
有可用于 Web 应用程序的持久键值存储和数据库存储。您可以使用localStorage对象保存您的身份验证数据并使用XMLHttpRequest将其发送到服务器。另一种选择是将您的持久数据保存在 SQLite 数据库中,但是在您的情况下,这似乎不是一个合适的解决方案。查看 Apple 的客户端存储和离线应用程序编程指南以获取详细信息/示例。