2

在我的 XPage 中,我有一个xe:djxDataGrid( dojox.grid.datagrid),它使用xe:restService了似乎使用的dojox.data.JsonRestStore.

没有代理一切正常,但由于公司政策,我的客户通过代理访问应用程序。在用户更新 DataGrid 中的数据后,它会在代理后面访问时显示旧值。

REST Control/JsonRestStore 发送ajax GET 请求获取数据时,请求头中没有Cache-Control参数。并且 Domino 不会Expires在响应头中放置参数。我相信这就是为什么旧版本的 GET 请求被代理缓存的原因。

我们试图在浏览器中禁用缓存,但这无济于事,这表明代理正在缓存请求。

我相信这可以通过以下方式解决:

  1. Cache-Control在请求标头中设置参数或
  2. Expires在响应标头中设置参数

但是我还没有找到设置其中任何一个的方法。对于 XPage Domino 设置Expires:-1响应标头,但不适用于 ajax GET 请求,即:

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

这会将 JSON 数据返回到 JsonRestStore 并由代理缓存。

一种选择是尝试获取代理的例外情况,以便对该站点的请求将绕过代理缓存。但是例外通常不容易通过。

有任何想法吗?谢谢。

更新1

我的同事建议我可以拦截 dojox.data.JsonRestStore 发出的 xhr GET 请求,并在 URL 中添加时间参数以防止缓存。这是我的问题:

防止页面上每个 Dojo xhr 请求中的缓存

更新2

@SvenHasselbach 有一个很好的解决方案来防止所有 xhrs 的缓存:

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

它似乎工作得很好,&dojo.preventCache=参数被添加到 URL 中,并且请求似乎也使用这个参数返回了正确的 JSON。但是当我使用该代码时,DataGrid 停止工作。每个 xhr 都会导致此错误:

火狐

尝试使用 Firefox 和 Chrome。数据的第一页仍然加载,因为 xhr 拦截尚未到位,但后续页面在每个单元格中仅显示“...”。

4

1 回答 1

1

解决方案是Julian Buss 博客评论部分的 Sven Hasselbach 代码需要稍作修改。

我更改xhrPostxhrGet并没有将代码放置到dojo.addOnLoad. 当放置在那里时,它在 DataGrid/Store 的第一个 XHR 中无效。

我还删除了headers修改,因为它覆盖了现有的标题。当 REST 控件从服务器请求数据时xhrGet,URL 始终相同,并且请求的行在 HTTP 标头中,如下所示:

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 Get URL 都有&dojo.preventCache=参数,这正是我想要的。接下来,我们将在客户环境中进行测试,看看这是否能解决他们的问题。

更新

正如 Julian 在他的博客中指出的那样,我还可以使用网站规则来设置Expirescache-controlhttp 响应标头。

更新

客户报告它现在正在为他们工作!

于 2013-01-28T12:49:32.840 回答