在ExtLib REST控件中禁用缓存(使用dojox.data.JsonRestStore)

时间:2013-01-25 10:18:20

标签: caching proxy dojo dojox.grid.datagrid xpages-extlib

在我的XPage中,我有xe:djxDataGriddojox.grid.datagrid)使用xe:restService似乎使用了dojox.data.JsonRestStore

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

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

我们尝试在浏览器中禁用缓存,但这没有帮助,这表明代理正在缓存请求。

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

  1. 在请求标头中设置Cache-Control参数或
  2. 在响应标头中设置Expires参数
  3. 但我还没有办法设置其中任何一个。对于XPage Domino设置Expires:-1响应标头,但不设置ajax GET请求:

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

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

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

    有什么想法吗?感谢。

    UPDATE1

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

    Prevent cache in every Dojo xhr request on page

    UPDATE2

    @SvenHasselbach有一个很好的解决方案,可以阻止所有xhrs的缓存:

    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 个答案:

答案 0 :(得分:1)

解决方案是 Sven Hasselbach code in the comment section of Julian Buss's blog,需要稍加修改。

我将xhrPost更改为xhrGet,但未将代码置于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获取网址都有&dojo.preventCache=参数,这正是我想要的。接下来,我们将在客户环境中进行测试,看看这是否能解决他们的问题。

<强>更新

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

<强>更新

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