Как выполнить динамическую перезапись URL в J2EE

Еще во времена ASP.NET я использовал URLRewriter.NET для динамической перезаписи URL. По сути, это HTTPModule, который перехватывает запросы страниц и перезаписывает URL-адреса в соответствии с правилами, которые вы определяете, очень похоже на MOD_REWRITE. Однако он также позволяет вам определять «Custom Transform», класс с одним методом, который выполняет перевод URL-адресов на лету. Вы можете использовать этот метод в БД, получить доступ к коллекции Application [] и делать практически все, что душе угодно.

Есть ли что-нибудь подобное в мире J2EE? Я хочу иметь возможность динамически перезаписывать URL-адреса и делегировать эту перезапись некоторому Java-коду. Я НЕ хочу просто создавать список статических перезаписей. Точно так же он должен выполнять фактическое маскирование URL-адресов, а НЕ перенаправления 3XX.

Если нет ничего, что могло бы это сделать, как бы я сам построил эту функциональность?


person sangfroid    schedule 09.11.2009    source источник
comment
Спасибо всем за то, что указали мне правильное направление! Похоже, в конце концов, это может быть легко сделать. Насколько я могу судить, RequestDispatcher.Forward () будет делать в значительной степени именно то, что я хочу. Кто-нибудь знает о недостатках или подводных камнях, связанных с этим подходом?   -  person sangfroid    schedule 10.11.2009
comment
Не знаю, в какой именно проблемной области, но это звучит очень выполнимо.   -  person Jé Queue    schedule 10.11.2009


Ответы (3)


Вы исследовали фильтры сервлетов? Я не пытался напрямую изменять URL-адрес, и я считаю, что параметры будут предварительно проанализированы в объекте запроса, но мы широко используем фильтры для анализа URL-адресов и помещения информации о пути в базу данных для другого использования сервлетов и JSP.

Вы можете очень легко обернуть объект запроса, пока он цепляется к целевым сервлетам.

person Jé Queue    schedule 09.11.2009
comment
+1: фильтры - это то, что нужно. Используйте HttpServletRequest#getRequestURI() для анализа информации о пути. - person BalusC; 10.11.2009
comment
Фактически, уже доступно несколько фильтров перезаписи URL с открытым исходным кодом, таких как OCPsoft Rewrite и PrettyFaces. ocpsoft.com/rewrite или ocpsoft.com/prettyfaces - person Lincoln; 26.11.2011

Как на счет этих:

http://ocpsoft.com/prettyfaces/

PrettyFaces - это расширение сервлетов на основе фильтра OpenSource с расширенной поддержкой JavaServer Faces - JSF 1.1, 1.2 и 2.0, что позволяет создавать красивые URL-адреса с возможностью закладок. PrettyFaces элегантно решает проблему «RESTful URL», включая такие функции, как: действия по загрузке страницы, бесшовная интеграция с навигацией по лицам, динамическое присвоение идентификатора представления, анализ управляемых параметров и совместимость с другими веб-фреймворками без настройки.

http://ocpsoft.com/rewrite/

Rewrite - это расширение сервлетов на основе OpenSource Filter для Java, позволяющее создавать красивые URL-адреса с возможностью закладок. Rewrite элегантно решает проблему «RESTful URL», включая такие функции, как: действия по загрузке страницы, анализ управляемых параметров, бесшовная интеграция с CDI, Spring и совместимость с другими веб-фреймворками без настройки.

http://tuckey.org/urlrewrite/

Основанный на популярном и очень полезном модуле mod_rewrite для apache, UrlRewriteFilter представляет собой веб-фильтр Java для любого J2EE-совместимого сервера веб-приложений (например, Resin, Orion или Tomcat), который позволяет вам переписывать URL-адреса до того, как они попадут в ваш код. Это очень мощный инструмент, как и mod_rewrite от Apache.

person skaffman    schedule 09.11.2009
comment
Это мощный инструмент, и мы используем его во многих проектах, но он основан на жестко закодированном списке правил в XML-документе. Это определенно лучший вариант, если вам не нужно наверстывать упущенное на ходу. - person Chris Hall; 10.11.2009
comment
Мы тоже его используем из-за истории, но пользоваться им становится все труднее, в частности, потому, что правила не связаны друг с другом. Только один может соответствовать. - person Rodney Gitzel; 12.01.2011
comment
OCPsoft Rewrite не страдает теми же ограничениями, что и Tuckey. - person Lincoln; 26.11.2011

Другой вариант - написать выигранный сервлет. Теперь напишите некоторый код манипулирования URL-адресом, используя объект запроса и найденный URL-адрес, и снова вызовите нужное действие страницы или сервлет.

Eg.

вы должны вызвать сервлет, используя URL-адрес

домен / urlServlet / param1 / param2 / ...

И ваш сервлет переведет его на

домен / запрошенная страница? p1 = param1 & p2 = param2 ...

person Umesh Aawte    schedule 12.11.2009