iPhone"Bookmark to Homescreen"删除了cookie和会话?

chr*_*ler 39 iphone web-applications mobile-safari iphone-standalone-web-app

现在我正在开发一个基于Web的应用程序,用户必须首先登录.

当我通过iPhone Safari打开页面,登录并重新启动Safari时,我仍然登录(Cookie和会话ID仍然设置).

但是当我使用"添加到主屏幕"添加此页面时,每次单击该页面的图标时,我都必须再次登录.

我没有找到任何相关信息.我该怎么做才能让我的用户将此页面设置为主屏幕的图标,并且每次打开时都无需登录?

fav*_*avo 14

一个非常简单的方法可能是在Bookmark-URL中使用一个唯一的令牌,它可以作为唯一的设备标识符.

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

该令牌可以在服务器端打开时在移动Safari浏览器的应用程序的时间,用户可通过"添加到主屏幕"的信息提示之前生成.然后可以使用快速重定向(...&token = randomToken)或位置散列(...#randomToken)将令牌添加到URL.

现在,只要从主屏幕打开书签,令牌就会发送到您的服务器,您可以识别用户的活动会话.您也可以将令牌用作永久会话ID,但出于安全考虑,我提出反对意见.

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

只要用户从主屏幕重新打开您的链接,令牌就会将您作为唯一的设备标识符.


Wil*_*ins 12

与favo相比,有一个更容易,更imo,更优雅的解决方案.

至少在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);
Run Code Online (Sandbox Code Playgroud)

有关此策略的更详细讨论,您可以查看我对此问题的回答:

在iPhone上的Web应用程序中维护PHP会话

  • 刚刚尝试了这个我遇到的问题,好的小技巧Wilbo,为我节省了大量的时间和精力. (2认同)

Jes*_*run 5

我将进一步扩展 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>
Run Code Online (Sandbox Code Playgroud)


ker*_*ich 3

Web 应用程序可以使用持久键值存储和数据库存储。您可以使用localStorage对象保存身份验证数据,并使用XMLHttpRequest将其发送到服务器。\n另一个选项是将持久数据保存在 SQLite 数据库中,但这对于您的情况来说似乎不是一个合适的解决方案.\n查看 Apple\xe2\x80\x99s客户端存储和离线应用程序编程指南以获取详细信息/示例。

\n

  • 如果您想坚持使用 cookies,@favo 答案将是更好的选择,因为:i。cookie 在现实世界中附加到 http 标头中,将其附加到具有类似效果的 URL ii。如果您的主屏幕应用程序(网页剪辑)在“独立模式”下运行,用户无法更改 URL。最后一件事:如果您关心安全性,您可以使用 localStorage 来刺激 2 路身份验证。 (2认同)
  • 我试过这个。使用“书签到主屏幕”不起作用。我找不到任何书面证据,但从我所有的测试来看,每次打开它时它都会清除 cookie 和 localStorage。 (2认同)