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

Чтобы понять проблемы, вызванные кэшированием, мы рассмотрим простой реальный сценарий, который может пролить свет на эту проблему.

В веб-приложении есть функция, при которой нажатие кнопки аудио извлекает соответствующее звуковое чтение значения капчи, присутствующего на веб-странице.

Однако в этой функции произошел сбой. Звуковой рендеринг был неточным, когда этот сайт был открыт в Mozilla Firefox.

Предположим, что URL-адрес https://localhost:8079/service/getaudio вызывается при нажатии кнопки рендеринга звука.

Звук работает нормально, когда он нажимается в первый раз.

Однако во время второго клика по другой капче звук, соответствующий капче при первом клике. Точно так же звук при третьем щелчке является точным, но при четвертом щелчке воспроизводится звук, соответствующий капче при третьем щелчке.

Тот же шаблон повторяется для всех нечетных и четных капч для звуковых кликов.

Что здесь случилось?

Для нечетных кликов браузер отправляет GET-запрос на сервер и получает свежий аудиофрагмент.

В то время как для четных кликов запросы GET не отправляются. Скорее браузер извлекает фрагмент аудио из кеша, и это причина нашего сбоя.

Этот конкретный сбой возникает из-за ошибки в Mozilla Firefox, о которой можно узнать из следующей темы: https://bugzilla.mozilla.org/show_bug.cgi?id=1129121

Эту проблему с кэшированием в Mozilla можно решить, заставив HTTP-запрос не кэшироваться во время вызова AJAX. Есть несколько способов добиться этого:

  1. Один из способов — добавить в HTTP-запрос заголовок директивы управления кешем. Например, добавление заголовка Cache-Control: no-cache к запросу явно указывает браузеру не кэшировать ответ на входящий запрос.

$.ajax({

URL: ‘https://clip.tn.gov.in/clipservice/getaudio’,

тип: «ПОЛУЧИТЬ»,

заголовки: {‘Cache-Control’: ‘no-cache’},

});

Помимо «no-cache», есть и другие параметры для заголовка «Cache-Control», такие как «no-store» и «max-age», чтобы установить другое поведение кэширования.

2. Другой способ — добавить уникальный параметр к URL-адресу запроса. Добавление параметра очистки кеша к исходному URL-адресу запроса, скажем, добавление параметра очистки кеша '?rand=new Date( ).getTime()' дает новый URL-адрес 'https://localhost:8079/service/getaudio?rand=»new Date().getTime()'. URL-адрес теперь уникален для каждого запроса, и браузер обязательно отправит новый запрос на сервер, а не извлечет кэшированную версию предыдущего запроса.

$.ajax({
url: 'https://clip.tn.gov.in/clipservice/getaudio?rand=1671603985185',
type: 'GET',
успех : function(response) {
// здесь обрабатывается ответ
}
});

3. Использование запроса POST вместо запроса GET, поскольку запросы POST по умолчанию не кэшируются браузерами или серверами. Следовательно, кэширование можно предотвратить с помощью запросов POST. Хотя POST-запросы могут быть хорошим способом предотвращения кэширования, некоторые серверы могут быть настроены на кэширование POST-запросов, что делает использование POST-запросов неэффективным.

Помимо запросов POST, существуют и другие типы запросов, такие как PUT и DELETE, которые по умолчанию не кэшируются.

4. Использование $.get() вместо $.ajax(): При использовании jQuery для выполнения вызовов AJAX можно использовать параметр cache, чтобы указать, следует ли кэшировать ответ, используя $.ajax вместо $. получать(). Например,

$.get(“https://localhost:8079/service/getaudio', myCallback)

Когда $.get() используется для вызова URL, результат кэшируется по умолчанию. Вместо этого, если используется $.ajax, кэширование можно отключить, установив cache: false для предотвращения кэширования ответа.

'$.ajax({

URL-адрес: 'https://localhost:8079/service/getaudio',

успех: myCallback,

кеш: ложь

});'

Но также следует помнить, что «$.ajax()» более мощный по сравнению с «$.get()», а «$.get()» имеет меньше параметров настройки при отправке запросов. В конце концов, требуются компромиссы, зависящие от различных факторов, чтобы решить, какой метод следует использовать для выполнения запросов.

К факторам относятся совместимость браузера, влияние сложности кэширования на производительность, простота обслуживания, чувствительность или конфиденциальность типа запрашиваемых данных и т. д.

В этом случае мы эффективно решаем нашу проблему со звуком, используя метод, упомянутый в пункте 2, добавляя уникальный параметр, который представляет собой комбинацию даты и времени. Этот метод работает эффективно, и звук для соответствующей капчи воспроизводится точно.

Вышеуказанные методы предотвратят только кеширование в браузере. Если сервер настроен на кеширование ответов, потребуются дополнительные шаги, чтобы сервер не возвращал кешированный ответ, например изменение конфигурации сервера.