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>