Jak użyć filtra serwletów w Javie, aby zmienić przychodzący adres URL żądania servletów?

Jak mogę użyć filtra servleta, aby zmienić przychodzący adres URL żądania servleta z

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

Do

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

?


Update: zgodnie z poniższymi krokami Balusca, wymyśliłem następujący kod:

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() {
        //
    }
}

Odpowiedni wpis w web.xml wygląda tak:

<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>

Próbowałem przekierować zarówno po stronie serwera, jak i po stronie klienta z oczekiwanymi rezultatami. Udało się, dzięki BalusC!

Author: Java_User, 2010-04-27

3 answers

  1. implementacja javax.servlet.Filter.
  2. W doFilter() metoda, rzucać przychodzące ServletRequest na HttpServletRequest.
  3. użycie HttpServletRequest#getRequestURI() aby złapać ścieżkę.
  4. Użyj prostego java.lang.String metody takie jak substring(), split(), concat() i tak dalej, aby wyodrębnić część zainteresowania i skomponować nową ścieżkę.
  5. użyj albo ServletRequest#getRequestDispatcher() i wtedy RequestDispatcher#forward() aby przesłać żądanie / odpowiedź na nowy adres URL (przekierowanie po stronie serwera, nie odzwierciedlone w pasku adresu przeglądarki), lub rzucają przychodzące ServletResponse na HttpServletResponse i wtedy HttpServletResponse#sendRedirect() przekierowanie odpowiedzi na nowy adres URL(przekierowanie po stronie klienta, odzwierciedlone w pasku adresu przeglądarki).
  6. Zarejestruj filtr w web.xml na url-pattern z /* lub /Check_License/*, w zależności od ścieżki kontekstowej, lub jeśli jesteś już na Servlecie 3.0, użyj @WebFilter zamiast tego adnotacja.

Nie zapomnij dodaj zaznaczenie w kodzie, jeśli URL wymaga zmiany , a jeśli Nie, to po prostu wywołaj FilterChain#doFilter(), w przeciwnym razie wywoła się w nieskończonej pętli.

Alternatywnie możesz również użyć istniejącego interfejsu API innych firm, aby wykonać całą pracę za Ciebie, na przykład Tuckey 's UrlRewriteFilter , który można skonfigurować tak, jak w przypadku Apache' a mod_rewrite.

 285
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 01:34:07

Możesz użyć gotowego do użycia Url Rewrite Filter z regułą taką jak Ta:

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

Sprawdź przykłady , aby dowiedzieć się więcej... przykłady.

 22
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 22:22:33

Prosty filtr adresu URL JSF oparty na krokach Odpowiedzi Balusca . Filtr przekazuje wszystkie żądania zaczynające się od ścieżki /ui (przypuśćmy, że masz tam zapisane wszystkie pliki xhtml) do tej samej ścieżki, ale dodając przyrostek 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 {

    }

}
 9
Author: Xtreme Biker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03