2013-01-25 32 views
2

在我的XPage中,我有一個xe:djxDataGriddojox.grid.datagrid),它使用xe:restService,似乎使用dojox.data.JsonRestStore在ExtLib REST控件(使用dojox.data.JsonRestStore)中禁用緩存

一切工作正常,沒有代理,但我的客戶端通過代理訪問應用程序,因爲公司政策。用戶更新DataGrid中的數據後,它會在代理後面顯示舊值。

當REST Control/JsonRestStore發送ajax GET請求以獲取數據時,請求標頭中沒有Cache-Control參數。而Domino不會在響應頭中放置Expires參數。我相信這就是爲什麼舊版本的GET請求被代理緩存的原因。

我們試圖在瀏覽器中禁用緩存,但是這並沒有幫助,這表明代理正在緩存請求。

我相信這可以解決或者通過:

  1. 設置在請求的頭部Cache-Control參數或
  2. 響應頭

設置Expires參數,但我還沒有找到一種方法,設置其中任何一個。對於XPage上多米諾骨牌Expires:-1響應頭,但不是爲AJAX GET請求是:

/mypage.xsp/?$$viewid=!ddrg6o7q1z!&$$axtarget=view:_id1:_id2:callback1:restService1 

這JSON數據返回到JsonRestStore,並得到由代理緩存。

一種方法是嘗試獲取代理的例外,以便對該站點的請求將繞過代理緩存。但例外情況通常不容易獲得。

任何想法?謝謝。

UPDATE1

我colleque建議我可以攔截dojox.data.JsonRestStore提出的XHR GET請求和時間參數添加到URL,以防止緩存。下面是我對這個問題:

Prevent cache in every Dojo xhr request on page

UPDATE2

@SvenHasselbach具有防止緩存所有XHR時一個很好的解決方案:

http://openntf.org/XSnippets.nsf/snippet.xsp?id=cache-prevention-for-dojo-xhr-requests

這似乎很好地工作,&dojo.preventCache=參數被添加到URL並且請求似乎也使用此參數返回正確的JSON。 但是當我使用該代碼時,DataGrid停止工作。每XHR導致此錯誤:

Firefox

試圖與Firefox和Chrome。數據的第一頁仍然加載,因爲xhr攔截還沒有到位,但隨後的頁面只顯示「...「在

回答

1

每個單元格。該解決方案是斯文哈塞爾巴赫code in the comment section of Julian Buss's blog需要被稍微修改。

我改變xhrPostxhrGet並沒有代碼放置到dojo.addOnLoad。當放置在那裏它不是有效地將數據網格/存儲所述第一XHR。

我還除去headers修改,因爲它會覆蓋現有的報頭。當來自服務器的REST控制請求數據與xhrGet的URL總是相同的,並要求行是在HTTP頭中升ike this:

Range: items=0-9 

當使用原始代碼時,此(和其他)標題消失。只需添加標題,我們就可以從args中獲取現有標題並追加到它們中。我沒有看到這種需要,因爲它應該足以在URL中添加參數。這裏是非常簡單的代碼,我使用的是:

if(!(dojo._xhrGet)) { 
dojo._xhrGet = dojo.xhrGet; 
} 

dojo.xhrGet = function (args) { 
args['preventCache'] = true; 
return dojo._xhrGet(args); 
} 

現在我越來越所有行和XHR獲取URL都&dojo.preventCache=參數這正是我想要的。接下來,我們將在客戶環境中進行測試,看看是否可以解決他們的問題。

更新

朱利安指出了他的博客,我也可以用網站規則設置Expirescache-control HTTP響應頭。

更新

客戶報告現在的工作對他們!