it-swarm.com.de

Wie verwende ich einen Servlet-Filter in Java), um eine URL für eingehende Servlet-Anfragen zu ändern?

Wie kann ich einen Servlet-Filter verwenden, um eine eingehende Servlet-Anforderungs-URL von zu ändern?

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

zu

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

?


pdate: gemäß den unten stehenden Schritten von BalusC habe ich den folgenden Code gefunden:

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

Der entsprechende Eintrag in web.xml sieht aus wie das:

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

Ich habe sowohl die serverseitige als auch die clientseitige Umleitung mit den erwarteten Ergebnissen versucht. Es hat funktioniert, danke BalusC!

177
Frank
  1. Implementiere javax.servlet.Filter .
  2. Umwandeln Sie in der Methode doFilter() das eingehende ServletRequest in HttpServletRequest .
  3. Verwenden Sie HttpServletRequest#getRequestURI() , um den Pfad zu erfassen.
  4. Verwenden Sie einfach Java.lang.String Methoden wie substring() , split() , concat() und so weiter, um den interessierenden Teil zu extrahieren und den neuen Pfad zu erstellen.
  5. Verwenden Sie entweder ServletRequest#getRequestDispatcher() und dann RequestDispatcher#forward() , um die Anforderung/Antwort an die neue URL weiterzuleiten (serverseitige Umleitung, nicht übernommen) in der Adressleiste des Browsers), oder den eingehenden ServletResponse in HttpServletResponse und dann HttpServletResponse#sendRedirect() , um die Antwort auf die neue URL umzuleiten (clientseitige Umleitung in der Adressleiste des Browsers).
  6. Registrieren Sie den Filter in web.xml Auf einem url-pattern Von /* Oder /Check_License/*, Je nach Kontextpfad, oder wenn Sie bereits mit Servlet 3.0 arbeiten die @WebFilter Anmerkung dafür.

Vergessen Sie nicht, den Code mit einem Häkchen zu versehen, wenn die URL muss geändert werden soll und wenn nicht, rufen Sie einfach FilterChain#doFilter() , sonst ruft es sich in einer Endlosschleife auf.

Alternativ können Sie auch einfach eine vorhandene API eines Drittanbieters verwenden, um die gesamte Arbeit für Sie zu erledigen, z. B. Tuckeys UrlRewriteFilter , das so konfiguriert werden kann, wie Sie es mit Apaches mod_rewrite Tun würden.

268
BalusC

Sie können den gebrauchsfertigen rl Rewrite Filter mit einer Regel wie dieser verwenden:

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

Überprüfen Sie die Beispiele für weitere ... Beispiele.

20
Pascal Thivent

Ein einfacher JSF-Url-Prettyfier-Filter, der auf den Schritten von BalusCs Antwort basiert. Der Filter leitet alle Anforderungen, die mit dem Pfad/ui beginnen (vorausgesetzt, Sie haben alle Ihre XHTML-Dateien dort gespeichert), an denselben Pfad weiter, fügt jedoch das XHTML-Suffix hinzu.

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 {

    }

}
5
Xtreme Biker