Как я могу использовать фильтр сервлета для изменения 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
выглядит следующим образом:
<filter>
<filter-name>urlRewriteFilter</filter-name>
<filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Я пробовал перенаправление на стороне сервера и на стороне клиента с ожидаемыми результатами. Это сработало, спасибо BalusC!
Ответы:
javax.servlet.Filter
.doFilter()
методе приведите входящееServletRequest
кHttpServletRequest
.HttpServletRequest#getRequestURI()
чтобы схватить путь.java.lang.String
методы , такие какsubstring()
,split()
,concat()
и так далее , чтобы извлечь часть интереса и составить новый путь.ServletRequest#getRequestDispatcher()
а затемRequestDispatcher#forward()
направить запрос / ответ на новый URL - адрес ( на стороне сервера переадресации, не отраженные в адресной строке браузера), или бросить входящийServletResponse
вHttpServletResponse
и затемHttpServletResponse#sendRedirect()
перенаправить ответ на новый URL - адрес ( на стороне клиента перенаправления, отраженные в адресная строка браузера).web.xml
на условияхurl-pattern
из/*
или/Check_License/*
, в зависимости от контекста пути, или если вы на Servlet 3.0 уже, использовать@WebFilter
аннотацию , что вместо этого.Не забудьте добавить проверку в коде, если URL-адрес необходимо изменить, а если нет , то просто позвоните
FilterChain#doFilter()
, иначе он будет вызывать себя в бесконечном цикле.В качестве альтернативы вы также можете просто использовать существующий сторонний API, чтобы выполнить всю работу за вас, например , UrlRewriteFilter Tuckey, который можно настроить так же, как и в Apache
mod_rewrite
.источник
RequestDispatcher#forward()
выполняется, остальные фильтры не будут выполнены. Итак, не будет ли лучший способ сделать это как сервлет?<dispatcher>FORWARD</dispatcher>
в отображение фильтра.<dispatcher>FORWARD</dispatcher>
в отображение фильтра.Вы можете использовать готовый фильтр Url Rewrite с таким правилом:
Проверьте примеры для более ... примеров.
источник
Простой фильтр JSF Url Prettyfier, основанный на ответах BalusC . Фильтр перенаправляет все запросы, начиная с пути / ui (предположим, что у вас есть все ваши файлы xhtml, хранящиеся там), по тому же пути, но с добавлением суффикса xhtml.
источник