0

我有一個OpenUI5應用程序;我的應用程序只有一個htlm頁面(index.html),一些js文件(用於邏輯控制器)和一些xml文件(用於視圖)。與單頁應用程序混淆

該應用程序是一個單頁面應用程序;這是我index.html起始頁:

<!DOCTYPE html> 
<html manifest="app.appcache"> 
<head> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
    <meta charset="UTF-8"> 
    <!--<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
    <meta http-equiv="cache-control" content="max-age=0" /> 
    <meta http-equiv="cache-control" content="no-cache" /> 
    <meta http-equiv="expires" content="0" /> 
    <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> 
    <meta http-equiv="pragma" content="no-cache" />--> 

    <title>My App</title> 

    <!-- UI5 Bootstrap with OpenUI5 --> 
    <script id="sap-ui-bootstrap" 

      type="text/javascript" 
      src="resources/openui/sap-ui-core.js" 
      data-sap-ui-theme="sap_bluecrystal" 
      data-sap-ui-xx-bindingSyntax="complex" 
      data-sap-ui-libs="sap.m" 
      data-sap-ui-resourceroots='{ 
      "ui5bp": "./", 
      "model": "./model" 
      }' 
     > 
    </script> 



    <!-- Custom Styles --> 
    <link rel="stylesheet" type="text/css" href="css/style.css" /> 

    <script> 

     new sap.m.Shell("Shell", { 
      showLogout : false, 
      app : new sap.ui.core.ComponentContainer({ 
       name : 'ui5bp' 
      }), 
      homeIcon : { 
       'phone' : "img/57_ogo.jpg", 
       '[email protected]' : "img/114_logo.jpg", 
       'tablet' : "img/72__logo.jpg", 
       '[email protected]' : "img/144_logo.jpg", 
       'precomposed': false, 
       'favicon' : "img/favicon.ico" 
      } 
     }).placeAt('root'); 
    </script> 
</head> 

<body class="sapUiBody" id="root"> 
</body> 

</html> 

,這是我清單文件app.appcache(我改變它在每一個新版本)

CACHE MANIFEST 
#APP VERSION 1.0.4-rc4 

#insert here files to cache 

#insert here files to NOT cache 
NETWORK: 
* 

OK!但是現在我在我的服務器和BOOM上覆制應用程序!某些頁面被重新載入,但其他頁面不會被載入...(例如,我有一個登錄XML-view,其中顯示已更新的發行版本以及未更新的設置對話框的XML) 爲什麼我有這種行爲?我希望瀏覽器在每次重新加載時重新加載每個文件

P.S. 如果我用F5重新載入應用程序,問題依然存在。 如果我在index.html文件添加這些元標籤的問題仍然

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
    <meta http-equiv="cache-control" content="max-age=0" /> 
    <meta http-equiv="cache-control" content="no-cache" /> 
    <meta http-equiv="expires" content="0" /> 
    <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> 
    <meta http-equiv="pragma" content="no-cache" /> 

僅模式瀏覽器,迫使整個應用程序的重新加載,取消手動緩存:

enter image description here

+0

又是什麼問題?您正在討論使用F5刷新瀏覽器。如果應用程序緩存按預期完成,則F5刷新不應從服務器獲取新版本。這是應用程序緩存的重點! –

+0

當我測試時,我通常會打開Chrome控制檯並在網絡選項卡 – Jorg

+0

中勾選「禁用緩存」框。也許我找到了問題.. [link](https://developer.mozilla.org/en- US/docs/Web/HTML/Using_the_application_cache#Example_1_a_simple_cache_manifest_file) 紅色消息顯示:「重要提示:請勿在緩存清單文件中指定清單本身,否則幾乎不可能通知瀏覽器新的清單可用。 也許在過去,我已經將appcache文件插入appcache ... O_o – padibro

回答

0

如果您可以在您的SPA的Java Servlet過濾器,這裏是一個有效的解決方案:CorrectBrowserCacheHandlerFilter.java

基本上,當你的瀏覽器請求的靜態文件時,服務器將重定向對同一個請求的每個請求都有一個哈希查詢參數(例如,?v=azErT),這取決於目標靜態文件的內容。

這樣做,瀏覽器將不會緩存在index.html例如申報(因爲總是會收到302 Moved Temporarily)的靜態文件,但只會緩存中的散列版本的那些(服務器回答200他們的)。所以瀏覽器緩存將被有效地用於這些散列版本的靜態文件。

免責聲明:我是CorrectBrowserCacheHandlerFilter.java的作者。