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

Как использовать фильтр сервлетов для изменения 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!

Ответы [ 3 ]

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

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

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

20 голосов
/ 28 апреля 2010

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

<rule>
  <from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
  <to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>

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

5 голосов
/ 29 июня 2016

Простой фильтр 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 {

    }

}
...