目前我正在开发一个基于Web的应用程序,用户必须首先登录。
当我通过iPhone Safari打开页面,登录并重新启动Safari时,我仍然登录(Cookie和会话ID仍然设置)。
但是当我使用“添加到主屏幕”添加此页面时,每次单击该页面的图标时,我都必须再次登录。
我没有找到任何相关信息。我该怎么做才能让我的用户将此页面设置为主屏幕 作为图标,每次打开它时仍然不必登录?
答案 0 :(得分:14)
一种非常简单的方法可能是使用Bookmark-URL中的唯一标记,该标记可以作为唯一的设备标识符。
实施例: http://myWebApp.com/?token=randomId29238/1
可以在Mobile Safari中的应用程序打开时在服务器端生成令牌,也可以在用户出现“添加到主屏幕”信息之前生成令牌。 然后可以使用快速重定向(...& token = randomToken)或位置散列(...#randomToken)将令牌添加到URL。
每当现在从主屏幕打开书签时,令牌将被发送到您的服务器,您可以识别用户的活动会话。 您也可以将令牌用作永久会话ID,但出于安全考虑,我提出反对意见。
要允许将来的注销和登录过程,您始终可以将新会话分配给令牌。
只要用户从主屏幕重新打开您的链接,该令牌就会将您作为唯一的设备标识符。
答案 1 :(得分:12)
与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);
有关此策略的更详细讨论,您可以查看我对此问题的回答:
答案 2 :(得分:4)
我将进一步扩展Waldo Baggins'答案。
当我碰到这个时,我发现发生这种情况的原因是服务器上设置的会话cookie通常没有设置过期值。在这种情况下,默认行为是浏览器在关闭/重新打开浏览器时丢弃cookie。由于浏览器在重新打开时不会重新发送cookie,因此即使服务器尚未在服务器上过期,服务器也无法识别会话,因此,您的用户将被重定向回登录页面。
当用户在网络应用模式下使用您的网站时(图标已添加到主屏幕),iOS会以与桌面计算机处理关闭和重新打开浏览器相同的方式处理导入/导出应用,并在重新打开时丢失会话
因此,按照Wilbo的建议并设置Cookie的过期时间,iOS会在用户导航回您的应用时检查Cookie是否已过期,如果没有,则重新发送Cookie从而维持会话。在Wilbo的答案中,1年的值非常长,您通常希望将其设置为8或24小时,并且理想情况下将其与您在服务器上设置的会话到期超时值同步。
请注意,作为一个副作用,当您从桌面浏览器访问您的站点,并且用户关闭并重新打开浏览器时,会话将继续保持,并且用户仍将登录,这不会是&#39以前是这种情况(除非他们私下浏览)。你的退出"功能必须正确处理此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>
答案 3 :(得分:3)
Web应用程序可以使用持久的键值存储和数据库存储。您可以使用 localStorage 对象保存身份验证数据,并使用 XMLHttpRequest 将其发送到服务器。 另一种选择是将持久性数据保存在SQLite数据库中,但在您的情况下,这似乎不是一个合适的解决方案。 查看Apple的Client-Side Storage and Offline Applications Programming Guide了解详细信息/示例。