Как использовать сервлет-фильтр в Java для изменения URL-адреса входящего сервлета?
Как использовать фильтр сервлета для изменения входящего URL-запроса запроса сервлета
http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123
в
- java.lang.IllegalStateException: невозможно (переслать | sendRedirect | создать сеанс) после того, как ответ был получен
- Получение параметров init в сервлете
- Запрос Http Servlet теряет параметры из тела POST после прочтения его один раз
- Как заставить пользователя регистрироваться на моем сайте в течение нескольких месяцев?
- Удобный способ анализа входящих параметров multipart / form-data в Servlet
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!
- Параметры запроса HTTP недоступны request.getAttribute ()
- Почему значения cookie с пробелом поступают на стороне клиента с кавычками?
- Загрузить файл свойств в Servlet / JSP
- Причина того, что «ответ Сервлета уже совершен»
- Как временно сохранить сгенерированный файл в веб-приложении на основе сервлета
- Весенние сеансовые компоненты (controllerы) и ссылки на службы с точки зрения сериализации
- Найти количество активных сеансов, созданных с данного клиентского IP-адреса
-
javax.servlet.Filter
. - В
doFilter()
ServletRequest
входящийServletRequest
вHttpServletRequest
. - Используйте
HttpServletRequest#getRequestURI()
чтобы захватить путь. - Используйте простые методы
java.lang.String
такие какsubstring()
,split()
,concat()
и т. Д., Чтобы извлечь интересующую часть и составить новый путь. - Используйте
ServletRequest#getRequestDispatcher()
а затемRequestDispatcher#forward()
для перенаправления запроса / ответа на новый URL-адрес (redirect на стороне сервера, не отображаемое в адресной строке браузера) илиServletResponse
входящегоServletResponse
наHttpServletResponse
а затемHttpServletResponse#sendRedirect()
для перенаправления ответа на новый URL-адрес (redirect на стороне клиента, отображаемое в адресной строке браузера). - Зарегистрируйте фильтр в
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/ решает эту проблему.