перенаправление между сервлетами Java с URL-адреса, содержащего # - PullRequest
2 голосов
/ 19 января 2012

Эй,

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

Дело в том, что когда вы указываете в своем браузере URL-адрес, содержащий #

http://anydomain.com/test/elsem/1234#dogeatdog

и по какой-то причине (т.е. есть бизнес-логика) вы хотите перенаправить на другую страницу

http://anydomain.com/test/els/1234

# dogeatdog будет добавлено к новому URL.

Я обнаружил такое поведение при разработке приложения для калитки, но сейчас я протестировал его с простым чистым Java-сервлетом. Может кто-нибудь объяснить это мне?

Вот код на случай, если я что-то не так делаю:

private void process(HttpServletRequest req, HttpServletResponse res)
{
    res.setContentType("text/plain");
    try
    {
        HttpSession session = req.getSession();
        Object as = session.getAttribute("as");
        if (as == null)
        {
            log.info("redirecting");
            session.setAttribute("as", 1);
            res.sendRedirect("/test/");
        }
        else
        {
            log.info("writing");
            PrintWriter out = res.getWriter();
            out.write("after redirect "+as);
            out.flush();
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

Ответы [ 2 ]

4 голосов
/ 19 января 2012

Хеш-фрагменты (#a_hash_fragment) никогда не покидают браузер, они не являются частью HTTP-запроса.

В этом случае веб-сервер получает GET /test/elsem/1234, и он отвечает кодом перенаправления 3xx и новым URL-адресом /test/els/1234, который ваш браузер выбирает и добавляет #dogeatdog.Имеет смысл сейчас?

ОБНОВЛЕНИЕ : Благодаря Заку, вот документ W3C, который точно объясняет, как это (должно) работать: http://www.w3.org/Protocols/HTTP/Fragment/draft-bos-http-redirect-00.txt

0 голосов
/ 19 января 2012

Из sendRedirect Javadoc :

Отправляет временный ответ перенаправления клиенту, используя указанный URL перенаправления местоположения. Этот метод может принимать относительные URL; Контейнер сервлета должен преобразовать относительный URL в абсолютный URL перед отправкой ответа клиенту. Если расположение относительно без начального символа '/' контейнер интерпретирует его как URI текущего запроса. Если местоположение является относительным с ведущей '/' контейнер интерпретирует его как относящийся к корню контейнера сервлета.

Из-за повторяющегося использования «относительный» в Javadoc, я подозреваю, что новый URL использует то, что он может из старого URL, а затем строит оттуда ...

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

См. это для хорошего объяснения перенаправления стихов вперед.

См. this для простых примеров пересылки запросов к сервлетам или JSP.

Конечно, при пересылке исходный URL-адрес останется нетронутым, поэтому он может не соответствовать тому, что вы ищете ...

EDIT
Получив информацию от milan, я нашел еще немного информации относительно фрагментов URL (материал после "#" - я не знал, что это было их официальное название, пока не переписывался с milan).

Есть еще одно сообщение SOF, в котором есть полезная информация об этом и, возможно, лучший ответ: Фрагмент URL и 302 перенаправления

У меня есть "+ 1'd" Милан за то, что он дал хорошее руководство в этом ...

...