Получить якорь из URI

Я пишу JSP/Servlet и пытаюсь получить якорную часть URI, например:

blabla.rdf#mark

Как мне получить оценку за мой запрос? Очевидно, что request.getParameter() не работает?

Любая помощь приветствуется.


person Hoax    schedule 28.10.2009    source источник
comment
Вот аналогичный вопрос для PHP с аналогичными ответами: stackoverflow.com/questions/1032242/   -  person Rob Hruska    schedule 28.10.2009


Ответы (3)


Это невозможно, так как клиенты не отправляют «якорную часть» на сервер.

Например, вот точный запрос, сгенерированный Chrome после отправки http://example.com/#foobar (записанный с помощью Wireshark):

GET / HTTP/1.1
Host: example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.223.11 Safari/532.3
Cache-Control: max-age=0
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
If-None-Match: "b300b4-1b6-4059a80bfd280"
If-Modified-Since: Tue, 15 Nov 2005 13:24:10 GMT

Видите, нет #foobar. Таким образом, серверное приложение не может его прочитать.

Вы можете использовать некоторую магию JavaScript, чтобы сохранить привязку в файле cookie или в скрытом поле ввода или в любом другом вуду, которым вы увлекаетесь. Но он никогда не будет работать для запросов, исходящих не с ваших собственных сайтов. Проще сделать все, что вам нужно, в серверной части строки запроса и использовать якорь только для задач, связанных только с JavaScript, или использовать его для навигации внутри простого HTML-документа, но это так 90-е;).

Вот важная часть из упомянутого RFC 1808:

Обратите внимание, что идентификатор фрагмента (и знак «#» перед ним) не считается частью URL-адреса. Однако, поскольку он обычно используется в том же строковом контексте, что и URL-адрес, синтаксический анализатор должен иметь возможность распознавать фрагмент, когда он присутствует, и отбрасывать его как часть процесса синтаксического анализа.

person sfussenegger    schedule 28.10.2009
comment
Для информации RFC 1808 объясняется, почему якорная часть не отправляется сервер. - person Nicolas C; 10.07.2014

Я предполагаю, что вы хотите сделать веб-приложение Ajax с закладками и хотите заменить определенные фрагменты DOM без перезагрузки всей страницы. (В противном случае вы могли бы использовать параметры запроса.) Как отмечает sfussenegger, браузер не передает «якорь» на сервер. Решение находится на стороне клиента.

Javascript window.location.hash предоставляет информацию об якорях. Вы можете добавить обработчик событий к событию window.onload, который захватывает window.location.hash и передает его на сервер в Ajax XHttpRequest. Вы ловите ответ и встраиваете его в DOM.

К сожалению, это два обмена клиент-сервер.

Подробнее об этом читайте на странице ajaxpatterns.

person pcjuzer    schedule 11.08.2010

Это решение будет работать только после нажатия кнопки отправки, но: вы можете использовать javascript, чтобы поместить в форму скрытое значение, для которого задано значение document.location. Это точно скажет вам, что браузер видит как ваш адрес.

person Spike Williams    schedule 28.10.2009