Как использовать сервлет-фильтр в Java для изменения URL-адреса входящего сервлета?

Как использовать фильтр сервлета для изменения входящего URL-запроса запроса сервлета

http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

в

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123

?


Обновление : согласно приведенным ниже шагам BalusC, я придумал следующий код:

 public class UrlRewriteFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { // } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; String requestURI = request.getRequestURI(); if (requestURI.startsWith("/Check_License/Dir_My_App/")) { String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1); String newURI = requestURI.replace(toReplace, "?Contact_Id="); req.getRequestDispatcher(newURI).forward(req, res); } else { chain.doFilter(req, res); } } @Override public void destroy() { // } } 

Соответствующая запись в web.xml выглядит так:

  urlRewriteFilter com.example.UrlRewriteFilter   urlRewriteFilter /*  

Я попробовал как redirect на стороне сервера, так и на стороне клиента с ожидаемыми результатами. Это сработало, спасибо BalusC!

  1. javax.servlet.Filter .
  2. В doFilter() ServletRequest входящий ServletRequest в HttpServletRequest .
  3. Используйте HttpServletRequest#getRequestURI() чтобы захватить путь.
  4. Используйте простые методы java.lang.String такие как substring() , split() , concat() и т. Д., Чтобы извлечь интересующую часть и составить новый путь.
  5. Используйте ServletRequest#getRequestDispatcher() а затем RequestDispatcher#forward() для перенаправления запроса / ответа на новый URL-адрес (redirect на стороне сервера, не отображаемое в адресной строке браузера) или ServletResponse входящего ServletResponse на HttpServletResponse а затем HttpServletResponse#sendRedirect() для перенаправления ответа на новый URL-адрес (redirect на стороне клиента, отображаемое в адресной строке браузера).
  6. Зарегистрируйте фильтр в web.xml на url-pattern /* или /Check_License/* , в зависимости от пути контекста, или если вы уже на Servlet 3.0, вместо этого используйте аннотацию @WebFilter .

Не забудьте добавить чек в код, если URL-адрес нужно изменить, а если нет , просто вызовите FilterChain#doFilter() , иначе он вызовет себя в бесконечном цикле.

В качестве альтернативы вы также можете использовать существующий сторонний API для выполнения всей вашей работы, например , UrlRewriteFilter от Tuckey, который можно настроить так же, как и с mod_rewrite Apache.

Вы можете использовать готовый к использованию Url Rewrite Filter с таким же правилом:

  ^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$ /Check_License?Contact_Id=My_Obj_$1  

Проверьте примеры для более … примеров.

Простой фильтр JSF Url Prettyfier, основанный на шагах ответа BalusC . Фильтр пересылает все запросы, начинающиеся с пути / ui (предположим, что вы сохранили все ваши файлы xhtml, хранящиеся там) по одному и тому же пути, но добавляя суффикс xhtml.

 public class UrlPrettyfierFilter implements Filter { private static final String JSF_VIEW_ROOT_PATH = "/ui"; private static final String JSF_VIEW_SUFFIX = ".xhtml"; @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = ((HttpServletRequest) request); String requestURI = httpServletRequest.getRequestURI(); //Only process the paths starting with /ui, so as other requests get unprocessed. //You can register the filter itself for /ui/* only, too if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) && !requestURI.contains(JSF_VIEW_SUFFIX)) { request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX)) .forward(request,response); } else { chain.doFilter(httpServletRequest, response); } } @Override public void init(FilterConfig arg0) throws ServletException { } } 

Обратите внимание, что если ваш исходный URL содержит параметры, то есть http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123 ? param1 = A & param2 = B, то эти параметры также будут перенаправлены на следующий сервлет / jsp. Я не нашел способ избавиться от исходных параметров или заменить их (только с помощью HttpServletRequestWrapper). Есть идеи?..

Обновление: кажется, что http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ решает эту проблему.

Interesting Posts

Почему и как C # разрешает доступ к закрытым переменным вне самого classа, когда он находится в пределах одного и того же classа?

`pg_tblspc` отсутствует после установки последней версии OS X (Yosemite или El Capitan)

Как использовать OpenGL ES в отдельном streamе на iphone?

Как отладить шейдер GLSL?

Почему String.valueOf (null) вызывает исключение NullPointerException?

Самый простой способ поддержки нескольких ориентаций? Как загрузить пользовательский NIB, когда приложение находится в Landscape?

Как сделать Android Spinner с исходным текстом «Выбрать один»,

Внесите «Добавить в избранное» в Rails 3 & 4

Хорошая библиотека C ++ для SOAP

Отправка файлов через Bluetooth

ADB не найдено устройств

Удалите строки со всеми или некоторыми НС (отсутствующие значения) в data.frame

didReceiveRemoteNotification когда в фоновом режиме

Как предотвратить закрытие командной строки после выполнения?

Запуск ОС с выделенного жесткого диска

Давайте будем гением компьютера.