Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как избавиться от кеширования AJAX-запросов? / 11 сообщений из 11, страница 1 из 1
09.01.2007, 10:51:28
    #34242094
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
Есть обычная ссылка:
Код: plaintext
1.
<a href="javascript: sendEmail();"><img src="images/email.bmp" width= 90  height= 60 /></a>

Реакция на нее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function sendEmail()
{
	var url = "<myAJAXservlet>?subAction=sendEmail";
	request.open("GET", url, true);
	request.onreadystatechange = behaviorSendEmail;
	request.send( null );
}
		
function behaviorSendEmail()
{
	 if  (request.readyState ==  4 )
	{
		 if  (request.responseText == "true") window.status = "Message sent";
		 else  window.status = "Sending failed";
	}  else 
		window.status = "Please wait while message formatted and sent";
}

Все обычное, стандартное и рабочее: нажимаем - отсылается ... но только один раз!!
Любое посвторное нажатие, даже после смены страницы, не дает никакого результата - если при первом разе есть какая-то задержка на отсылку сообщения, то при последующих - мгновенная отработка request.readyDtate == 4. При повторном вызове обращения к сервлету уже нет.

Похожая ерунда происходит со страницами: например, onLoad в тэге <body> отрабатывается только один раз при первой загрузке страницы, любое обновление или смена страниц не дает никакого результата - onLoad больше не отрабатывается.

Я так понимаю, что происходит кеширование запросов в пределах одной сессии. Как от этого избавиться?

Спасибо.
...
Рейтинг: 0 / 0
09.01.2007, 10:53:12
    #34242105
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
добавить к строке запроса:
Код: plaintext
1.
2.
3.
4.
        function doRequest(url) {
            var lRand = Math.random();
            var rUrl = url + "&rand=" + lRand;
        }
...
Рейтинг: 0 / 0
09.01.2007, 11:40:09
    #34242316
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
Блин, ступил ... от метода реализации концепция не меняется: что малое, что большое ...
Работает. Спасибо за наводку.
...
Рейтинг: 0 / 0
09.01.2007, 16:58:48
    #34243525
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
можно проще
req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");

А заголовки response типа Cache-control и pragma не помогают.
...
Рейтинг: 0 / 0
09.01.2007, 19:12:04
    #34243912
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
LINUXERА заголовки response типа Cache-control и pragma не помогают.

В запросе - естественно, не помогают. Спецификация HTTP не предусматривает таких заголовков в ЗАПРОСАХ.

Браузер же в действительности кэширует НЕ запросы, а ОТВЕТЫ. То есть вы не с того конца начали. Для того, чтобы ответ НЕ кэшировался, ваш сервлет должен послать в ответе соответствующие заголовки. Для HTTP/1.1 браузеров в 100% случаев достаточно послать

Код: plaintext
1.
response.setHeader( "Cache-Control", "no-cache" );
response.setHeader( "Pragma", "no-cache" );
...
Рейтинг: 0 / 0
09.01.2007, 19:21:01
    #34243931
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
Deadyдобавить к строке запроса:
Код: plaintext
1.
2.
3.
4.
        function doRequest(url) {
            var lRand = Math.random();
            var rUrl = url + "&rand=" + lRand;
        }


Очень плохой совет. Хотя и будет работать. Однако

1. Собственно код плохой. Поди разбери со стороны, зачем это сделано. Умный-то поймет, а дурак не догадается. А на сопровождение умных не хватает.

2. Если таких запросов будет несколько, кэш браузера будет забиваться ответами на эти по сути одинаковые, но с точки зрения браузера разные запросы. Браузер, клнечно, не загнется, но зачем заставлять его делать дурную работу?

3. На стороне сервера добавляется работа по экстракции дополнительного параметра запроса. Опять же сервер не загнется, но зачем заставлять его делать дурную работу?

В общем, см. мой пост выше.
...
Рейтинг: 0 / 0
13.01.2007, 03:54:56
    #34253190
v_777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
Кеширование при использовании AJAX гораздо чаще мешает, чем помогает. Я его прибил глобально при помощи фильтра

HttpServletResponse myHttpResponse=((HttpServletResponse)response);
myHttpResponse.addHeader( "Cache-Control", "no-cache" );
myHttpResponse.setHeader( "Pragma", "no-cache" );
chain.doFilter(request, myHttpResponse);

Теперь не нужно в каждой jsp думать о заголовках. Мне кажется это удобно.
...
Рейтинг: 0 / 0
13.01.2007, 09:28:13
    #34253245
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
М.Голованов LINUXERА заголовки response типа Cache-control и pragma не помогают.

В запросе - естественно, не помогают. Спецификация HTTP не предусматривает таких заголовков в ЗАПРОСАХ.

Браузер же в действительности кэширует НЕ запросы, а ОТВЕТЫ. То есть вы не с того конца начали. Для того, чтобы ответ НЕ кэшировался, ваш сервлет должен послать в ответе соответствующие заголовки. Для HTTP/1.1 браузеров в 100% случаев достаточно послать

Код: plaintext
1.
response.setHeader( "Cache-Control", "no-cache" );
response.setHeader( "Pragma", "no-cache" );

Ещё бы заголовки RESPONSE помогали в ЗАПРОСАХ
Хотя похоже я просто опечатался в одном из них и не все браузеры дали нужный результат
...
Рейтинг: 0 / 0
13.01.2007, 09:41:18
    #34253252
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
v_777Кеширование при использовании AJAX гораздо чаще мешает, чем помогает. Я его прибил глобально при помощи фильтра

HttpServletResponse myHttpResponse=((HttpServletResponse)response);
myHttpResponse.addHeader( "Cache-Control", "no-cache" );
myHttpResponse.setHeader( "Pragma", "no-cache" );
chain.doFilter(request, myHttpResponse);

Теперь не нужно в каждой jsp думать о заголовках. Мне кажется это удобно.
вообще отказываться от кэширования не хорошо.
Фильтровать выборочно ещё часто проблематичнее, чем писать серверные заголовки каждый раз
Использование "If-Modified-Since" удобно, т к с клиента позволяет указывать что кэшировать, а что нет
...
Рейтинг: 0 / 0
13.01.2007, 14:54:33
    #34253463
v_777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
To LINUXER
"If-Modified-Since" не поможет, если изменяется не jsp, а данные в базе, которые эта jsp отображает.
Да я и не призываю всех "делай, как я", но в моем приложении действительно кеширование только мешало. А поскольку я уже использовал для аутентификации фильтр (одна точка входа на все приложение), то дописав в него 4 строчки решилась проблема кеширования. Если кому важно гибко решать, что кешировать, а что нет, тут конечно в каждой jsp нужно заголовки крутить.
...
Рейтинг: 0 / 0
14.01.2007, 19:20:55
    #34254332
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от кеширования AJAX-запросов?
v_777Кеширование при использовании AJAX гораздо чаще мешает, чем помогает. Я его прибил глобально при помощи фильтра

HttpServletResponse myHttpResponse=((HttpServletResponse)response);
myHttpResponse.addHeader( "Cache-Control", "no-cache" );
myHttpResponse.setHeader( "Pragma", "no-cache" );
chain.doFilter(request, myHttpResponse);

Теперь не нужно в каждой jsp думать о заголовках. Мне кажется это удобно.

Кстати, очень даже правильно. И разумно - поскольку по существу весь контент, генерируемый servlet engine, дниамический. И экономно, постольку не надо писать одно и то же в каждом сервлете / JSP. Как я раньше об этом не подумал?... тем более что фильтр у меня имеет каждое приложение. Спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как избавиться от кеширования AJAX-запросов? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]