30

现在我正在开发一个基于Web的应用程序,用户必须首先登录。iPhone“Bookmark to Homescreen”删除cookies和会话?

当我用iPhone Safari浏览器,登录打开页面,并重新启动Safari浏览器,我仍然登录(曲奇&会话ID仍设置)。

但是,当我加入这个页面与“添加到主屏幕”,我每次点击图标该页面,我需要再次登录。

我没有找到任何有关信息。我能做些什么,因此我的用户可以将此页面设置为主屏幕 作为图标,每次打开时都不必登录?

回答

3

存在可用于Web应用程序的持久性键值存储和数据库存储。您可以使用localStorage对象并使用XMLHttpRequest将您的身份验证数据保存到服务器。 另一种选择是将持久数据保存在SQLite数据库中,但这似乎不适合您的情况。 查看Apple的Client-Side Storage and Offline Applications Programming Guide了解详情/示例。

+1

:)安静复杂只是为了获得相同的结果Safari浏览器。你有没有简单的例子。只是为了保存实际的COOKIES,所以当我重新启动用户例如不必再次登录。 – 2010-10-04 14:59:03

+2

如果你想坚持使用cookies,@favo的答案将是一个更好的选择,因为:i。 cookie被添加到真实世界中的http标头中,并附加到具有类似效果的URL ii。如果主屏幕应用程序(网络剪辑)在“独立模式”下运行,则用户无法更改网址。最后一件事:如果您关心安全性,您可以使用localStorage来激发双向身份验证。 – vincicat 2012-01-04 15:37:07

+0

我试过了。使用“书签到主屏幕”不起作用。我找不到任何书面证明,但从我所有的测试中,每次打开它时都会清除cookie和localStorage。 – 2012-05-09 08:55:36

13

一个非常简单的方法可能是在您的书签URL中使用唯一的标记,它可以为您提供唯一的设备标识符。

实施例: http://myWebApp.com/?token=randomId29238/1

令牌可以在服务器侧在开口中移动Safari的应用程序的时间和用户之前生成被提示“添加到主屏幕”的信息。 然后可以使用快速重定向(... & token = randomToken)或位置哈希(...#randomToken)将令牌添加到URL中。

每当书签现在从主屏幕打开后,令牌发送到您的服务器,并可以识别用户的活动会话。 您也可以将该令牌用作永久会话ID,但由于安全问题,我建议不要这样做。

要允许将来的注销和登录过程,您始终可以将新会话分配给令牌。

无论何时用户将从他的主屏幕重新打开您的链接,该令牌都将作为唯一设备标识符提供给您。

+0

为什么选择投票? – favo 2012-04-25 14:14:44

+0

我想我可能已经发现了一种更简单,更优雅的策略,但我还没有能够在6.0以前的iOS版本下进行测试。我在下面发布了一个答案,显示了如何。 – 2013-01-30 01:00:56

9

有一个比favo更容易,更精细,更优雅的解决方案。

至少的iOS 4.2.1,5.1.1,6.0和6.1(我无法测试其它版本)下,如果扩展手动您的会话cookie的有效期,Safari会坚持到session 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); 

对于这一战略的更详细的讨论,你可以看看我的这个问题的答案:

Maintain PHP Session in web app on iPhone

+2

刚刚在我遇到的问题上尝试过这个,好的小绝招Wilbo,为我节省了很多时间和精力。 – Steven 2013-02-14 18:28:31

+0

据我所知,我无法在iOS7上正常工作,即使明确设置cookie超时也没有cookie被保留 – SWa 2014-05-07 11:38:22

+1

嗨,Kyle,刚刚在iOS 7.1.1下测试了它,它对我来说工作正常(会话重启设备后恢复成功)。你确定会话ID实际上改变了吗?此解决方案不会奇迹般地存储用户正在查看的内容,它只是保留会话cookie,以便您的服务器可以稍后识别相同的会话。但是,服务器仍然要记住用户在该会话中的位置,然后在他返回到您的Web应用程序时提供该内容。 – 2014-05-07 11:52:23

1

我要去在Waldo Baggins的回答中进一步扩展。

当我遇到这个时,我发现这种情况发生的原因是在服务器上设置的会话cookie通常没有设置过期值。在这种情况下,默认行为是浏览器在关闭/重新打开浏览器时放弃Cookie。由于浏览器在重新打开时不重新发送cookie,即使服务器尚未到期,服务器也无法识别会话,因此,您的用户被重定向回登录页面。

当用户在网页应用程序模式下使用您的网站(图标添加到主屏幕)时,iOS会像使用桌面计算机一样处理关闭并重新打开浏览器,并在应用程序之间导航/重新开放。

因此,遵循Wilbo的建议并设置cookie的到期时间,iOS会检查cookie在用户导航回到您的应用时是否过期,如果没有,请重新发送cookie,从而维护会话。在Wilbo的回答中,1年的值非常长,您通常希望将其设置为8或24小时,并且理想情况下将其与您在服务器上设置的会话过期超时值进行同步。

请注意,作为副作用,当您从站点浏览器访问您的站点,并且用户关闭并重新打开浏览器时,会话将继续存在并且用户仍将登录,以前一直是这种情况(除非他们是私人浏览的)。您的“注销”功能必须妥善处理到期的这个cookie。

对于使用的web.xml 3.0或更高版本在Java Web应用程序,要做到这一点最简单的方法就是修改<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>