Отключить кеш в элементе управления ExtLib REST (который использует dojox.data.JsonRestStore)

В моем 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

Моя коллега предположила, что я могу перехватить запросы xhr GET, сделанные dojox.data.JsonRestStore, и добавить параметр времени к URL-адресу, чтобы предотвратить кеширование. Вот мой вопрос по этому поводу:

Запретить кеширование в каждом запросе Dojo xhr на странице

Обновление2

@SvenHasselbach имеет отличное решение для предотвращения кеширования для всех xhrs:

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

Кажется, он работает отлично, к URL-адресам добавляется параметр &dojo.preventCache=, и запросы, похоже, возвращают правильный JSON также с этим параметром. Но DataGrid перестает работать, когда я использую этот код. Каждый xhr вызывает эту ошибку:

Firefox

Пробовал с Firefox и Chrome. Первая страница данных все еще загружается, потому что перехват xhr еще не установлен, но на последующих страницах в каждой ячейке отображается только «...».


person Panu Haaramo    schedule 25.01.2013    source источник


Ответы (1)


Решение - Свена Хассельбаха код в разделе комментариев блога Джулиана Басса, который нужно немного изменить.

Я изменил xhrPost на xhrGet и не поместил код в dojo.addOnLoad. Когда он был помещен туда, он не был эффективен в первом XHR DataGrid / Store.

Я также удалил модификацию 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);
}

Теперь я получаю все строки, и все URL-адреса XHR Get имеют параметр &dojo.preventCache=, что как раз то, что я хотел. Затем мы протестируем в среде клиента, чтобы увидеть, решит ли это их проблему.

Обновить

Как отмечает Джулиан в своем блоге, я мог бы также использовать правило веб-сайта для установки Expires или cache-control заголовков HTTP-ответов.

Обновить

Заказчик сообщает, что теперь у них работает!

person Panu Haaramo    schedule 28.01.2013