Ответ 1
Добавьте что-то уникальное в запрос (например, временную метку URL-адреса), и он больше не будет кэшироваться.
Мое приложение сервлета развернуто на direct.albunack.net, а на www.albunack.net есть кеш CloudFront.
Страница по умолчанию (index.jsp) - это поиск (artist). Предполагая, что на мгновение мы используем direct.albunack.net, когда вы вводите поиск и отправляете поиск, direct.albunack.net/artist/search. Все под/художником сопоставляет сервлет, этот сервлет выполняет поиск, если он находит только один результат, тогда он перенаправляет на direct.albunack.net/artist/artistid - для этого используется тот же сервлет, чтобы создать страницу для этого исполнителя и верните его.
Если вместо этого он находит несколько результатов, он пересылает результаты обратно в index.jsp, но отображает несколько результатов, если пользователь затем нажимает на один из этих результатов, они снова перенаправляются на direct.albunack.net/artist/artistid
Пока все хорошо, проблема возникает, когда я использую www.albunack.net. Поведение по умолчанию (*) Cloudfront - кэшировать все запросы, а не форвардные заголовки ectera. Но мы добавляем другое поведение для пути /artist/search, чтобы он не кэшировал фактический поиск.
Когда он находит несколько результатов, он перенаправляет на http://www.albunack.net/index.jsp, а затем затем нажимает на один из вариантов перенаправления на http://www.albunack.net/artist/ artistid.
Но проблема у меня (я думаю) заключается в том, что, поскольку поиск делегирует до direct.albunack.net, когда есть только один выбор, он перенаправляется на http:// direct.albunack.net/artist/artistid в обход кеша и раскрытие нашего прямого интерфейса.
Итак, как мне это кодировать, если я на самом деле жестко задаю полный путь, включая сервер, тогда он не будет работать при запуске локально, что это правильный путь.
Экстракт кода сервлета:
if (!Strings.isNullOrEmpty(artistName))
{
//Look up artist for that id
MusicBrainzSearchArtist mbArtistSearch = new MusicBrainzSearchArtist();
List<Artist> mbArtists = mbArtistSearch.queryByArtistName(artistName);
if (mbArtists.size() == 0)
{
request.setAttribute(ERROR, InfoMessage.MSG_NO_RESULTS_FOUND.getMsg(artistName));
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}
else if (mbArtists.size() == 1)
{
response.sendRedirect("/artist/" + mbArtists.get(0).getId());
return;
}
else
{
request.setAttribute(ERROR, InfoMessage.MSG_MULTIPLE_RESULTS_FOUND.getMsg(artistName));
request.setAttribute("results", mbArtists);
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}
}
Обновление
Я изменил
response.sendRedirect("/artist/" + mbArtists.get(0).getId());
to
response.sendRedirect(getRedirectServePath(request) + "/artist/" + mbArtists.get(0).getId());
public String getRedirectServerPath(HttpServletRequest request)
{
return "http://" + request.getServerName() + ":" + request.getServerPort();
}
и это работает, но это кажется настолько взломанным, и я не уверен, конечно, почему он работает, поскольку я думал, что request.getServerName() вернет direct.albunack.net или это www.albunack.net, потому что getServerName() возвращает имя исходной точки входа на сервер, но без нее путь/художник разрешит текущий сервер при выполнении перенаправления?
Добавьте что-то уникальное в запрос (например, временную метку URL-адреса), и он больше не будет кэшироваться.