1. 程式人生 > >history.back返回後資料丟失的解決辦法

history.back返回後資料丟失的解決辦法

‍js使用history.back返回表單資料丟失的主要原因就是使用了session_start();的原因,該函式會強制當前頁面不被快取。

 

解決辦法如下:

在你的 Session_start 函式後加入 header("Cache-control: private"); 注意在本行之前你的PHP程式不能有任何輸出。

還有基於session的解決方法,在session_start前加上 
session_cache_limiter('nocache');// 清空表單 
session_cache_limiter('private'); //不清空表單,只在session生效期間 
session_cache_limiter('public'); //不清空表單,如同沒使用session一般

 

  • session_cache_limiter(private,must-revalidate)是什麼意思

    表義一:

    指定會話頁面所使用的緩衝控制方法:
    當session_cache_limiter('private')時,用處是讓表單history.go(-1)的時候,填寫內容不丟失!就避免頁面失效的警告!

    表義二:

    這個會話與header('cache-control:private,must_revalidate');效果相同

 

但是要值得注意的是session_cache_limiter()方法要寫在session_start()方法之前才有用;

 

支援頁面回跳詳解,session_cache_limiter()的使用詳解

 

現在表單的填寫,我們可以用AJAX對使用者隨時進行驗證,進行友好的提示,但是在使用者沒有留意AJAX友好提示,提交了錯誤的表單,跳回原頁,而填寫的資訊卻全部丟失了。要支援頁面回跳,有以下的辦法:

  • 1.使用session_cache_limiter方法:

session_cache_limiter('private,must-revalidate');

 

但是要值得注意的是session_cache_limiter()方法要寫在session_start()方法之前才有用;

  • 2.用header來設定控制快取的方法:

 

在開發過程中,往往因為表單出錯而返回頁面的時候填寫的資訊都不見了,為了支援頁面回跳,可以通過兩種方法實現。

第一,使用Header方法設定訊息頭Cache-control 
引用:
header('Cache-control: private, must-revalidate');//支援頁面回跳
第二,使用session_cache_limiter方法 
引用:
//注意要寫在session_start方法之前
session_cache_limiter('private, must-revalidate');

補充:
Cache-Control訊息頭域說明
Cache-Control指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中的快取處理過程。請求時的快取指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if- cached,響應訊息中的指令包括public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate、max-age。各個訊息中的指令含義如下:

Public指示響應可被任何快取區快取。

Private指示對於單個使用者的整個或部分響應訊息,不能被共享快取處理。這允許伺服器僅僅描述當用戶的部分響應訊息,此響應訊息對於其他使用者的請求無效。

no-cache指示請求或響應訊息不能快取

no-store用於防止重要的資訊被無意的釋出。在請求訊息中傳送將使得請求和響應訊息都不使用快取。

max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。

min-fresh指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。

max-stale指示客戶機可以接收超出超時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以接收超出超時期指定值之內的響應訊息。

關於表單重新整理

問:為什麼我在點選瀏覽器的後退按鈕後,所有欄位的資訊都被清空了?

答:這是由於你在你的表單提交頁面中使用了 session_start 函式。該函式會強制當前頁面不被快取。解決辦法為,在你的 Session_start 函式後加入 header(雙引號Cache-control: private雙引號); 注意在本行之前你的PHP程式不能有任何輸出。

補充:還有基於session的解決方法,在session_start前加上 
引用:
session_cache_limiter('nocache');// 清空表單
session_cache_limiter('private'); //不清空表單,只在session生效期間
session_cache_limiter('public'); //不清空表單,如同沒使用session一般

可以在session_start();前加上 session_cache_limiter('private,max-age=10800');