在我的XPage中,我有xe:djxDataGrid
(dojox.grid.datagrid
)使用xe:restService
似乎使用了dojox.data.JsonRestStore
。
没有代理,一切正常,但我的客户端因公司政策而通过代理访问应用程序。用户更新DataGrid中的数据后,在代理后面访问时会显示旧值。
当REST Control / JsonRestStore发送ajax GET请求以获取数据时,请求标头中没有Cache-Control
参数。并且Domino不会在响应标头中放置Expires
参数。我相信这就是为什么老版本的GET请求被代理缓存了。
我们尝试在浏览器中禁用缓存,但这没有帮助,这表明代理正在缓存请求。
我相信这可以通过以下方式解决:
Cache-Control
参数或Expires
参数但我还没有办法设置其中任何一个。对于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和Chrome。第一页数据仍然加载,因为xhr拦截尚未到位,但后续页面在每个单元格中仅显示“...”。
答案 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在他的博客中指出的那样,我也可以使用网站规则来设置Expires
或cache-control
http响应标头。
<强>更新强>
客户报告它现在正在为他们工作!