Как закодировать мой сервлет, чтобы он хорошо работал с Cloud Cloud Cache

Мое приложение сервлета развернуто на 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() возвращает имя исходной точки входа на сервер, но без нее путь/художник разрешит текущий сервер при выполнении перенаправления?

Ответы

Ответ 1

Добавьте что-то уникальное в запрос (например, временную метку URL-адреса), и он больше не будет кэшироваться.