В контексте сервлета Java, в чем разница между перезаписью URL и пересылкой? - PullRequest
1 голос
/ 31 октября 2011

Как разработчику веб-приложения на Java, когда мне нужно использовать перезапись URL-адресов и в чем разница между перезаписью URL-адресов и пересылкой?

Я искал на других сайтах, я получаю противоречивую информацию, в зависимости от того, с кем вы разговариваете, как SEO-специалисты ответят на этот вопрос по-разному.

AFAIK в обоих случаях клиент (браузер) не проинформирован об изменении, и конечный пользователь видит точно такой же URL-адрес, который клиент первоначально запрашивал при возврате ответа с сервера.

Пожалуйста, обратите внимание, что этот вопрос относится к Java Servlet API, в котором определены метод forward и методы sendRedirect, в которых перенаправление и переадресация - это абсолютно разные вещи. Этот вопрос о разнице между пересылкой (как определено методом пересылки в API сервлетов) и перезаписью URL. В вопросе четко говорится, что ответ должен быть в контексте Java-сервлета. Самое главное, когда мне нужно использовать перезапись URL, опять же в контексте разработки веб-приложения на Java.

Ответы [ 2 ]

8 голосов
/ 31 октября 2011

Термин «пересылка» в этом вопросе неоднозначен. В мире JSP / Servlet «пересылка» более известна из концепции MVC, что URL запроса (как видно в адресной строке браузера) эффективно вызывает сервлет (как соответствует его шаблону URL в web.xml или @WebServlet). ), который выполняет роль контроллера для подготовки модели и использует JSP в качестве представления для представления модели. Эта JSP, в свою очередь, называется "пересылка". Это делается RequestDispatcher#forward():

request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response);

Это действительно не отражает URL JSP в адресной строке браузера. Это происходит исключительно на стороне сервера. По сути, сервлет «загружает» JSP и передает ему запрос / ответ, чтобы он мог выполнять свою работу по генерации HTML-содержимого. Обратите внимание, что JSP в приведенном выше примере скрыт в папке /WEB-INF, что делает его недоступным для конечных пользователей, пытающихся ввести полный путь в адресной строке браузера.

В общем мире веб-разработки термин «переадресация» также известен из «переадресации URL», что по сути аналогично перенаправлению URL. Это, в свою очередь, действительно вызывает изменение в адресной строке браузера. Это в мире JSP / Servlet, более формально известном как «перенаправление» (хотя большинство начинающих сначала путают его с «переадресацией»). Это делается HttpServletResponse#sendRedirect():

response.sendRedirect("another-servlet-url");

По сути, сервер сообщает клиенту посредством HTTP-ответа 3nn с заголовком Location, что клиент должен выполнить новый запрос GET для данного Location. Вышесказанное фактически совпадает со следующим:

response.setStatus(302);
response.setHeader("Location", "another-servlet-url");

Поскольку клиент (веб-браузер) получил указание выполнить эту работу, вы увидите, что это изменение URL отражается обратно в адресной строке браузера.


Термин «перезапись URL» также неоднозначен. В мире JSP / Servlet «перезапись URL» - это форма добавления идентификатора сеанса к URL, чтобы браузеры без файлов cookie все еще могли поддерживать сеанс с сервером. Вы, вероятно, когда-либо видели атрибут ;jsessionid=somehexvalue в URL. По умолчанию это не выполняется автоматически, но большинство основанных на сервлетах сред MVC делают это автоматически. Это делается с помощью HttpServletResponse#encodeURL() или encodeRedirectURL():

String encodedURL = response.encodeURL(url); // or response.encodeRedirectURL(url)
// Then use this URL in links in JSP or response.sendRedirect().

(что, в свою очередь, является неоднозначным термином. С «кодировкой URL» вы обычно думаете о процентном кодировании . Для этого не предусмотрено API Servlet, обычно это делается с помощью URLEncoder#encode() или, более корректно с технической точки зрения, в JSP с помощью JSTL <c:url> и <c:param> или любым другим Компонент пользовательского интерфейса, предоставляемый основанной на сервлетах средой MVC, такой как JSF <h:outputLink>)

В общем мире веб-разработки (особенно с Apache HTTPD / PHP), «перезапись URL» более известна, чем то, что делает Apache HTTPD mod_rewrite: отображение входящих URL-адресов на конкретные ресурсы без отражения изменение URL на стороне клиента. В мире JSP / Servlet это также возможно, и обычно это делается реализацией Filter, которая использует RequestDispatcher#forward(). Хорошо известной реализацией является URLRewriteFilter Tuckey .


Я признаю, что это также смущало меня долгое время, когда я только начинал с JSP / Servlet, наверняка, имея свои корни в мире Apache HTTPD / PHP.

2 голосов
/ 31 октября 2011

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

Пересылка (или перенаправление) выполняется браузером (обычно автоматически), когдапо указанию сервера через некоторые коды ошибок 3xx (когда перенаправление разрешено клиентом).В этом случае будут обработаны два запроса (не обязательно оба из вашего сервлета);первый отвечает кодом ошибки и URL-адресом для перенаправления, а второй - правильным запросом после перенаправления клиента.

...