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
?
Update : Gemäß den folgenden 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 relevante Eintrag in web.xml
sieht folgendermaßen aus:
<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!
Antworten:
javax.servlet.Filter
.doFilter()
Methode wandeln Sie den eingehendenServletRequest
inHttpServletRequest
.HttpServletRequest#getRequestURI()
, um den Pfad zu ergreifen.java.lang.String
Methoden wiesubstring()
,split()
,concat()
und so weiter , den Teil von Interesse zu extrahieren und den neuen Pfad zu komponieren.ServletRequest#getRequestDispatcher()
und dannRequestDispatcher#forward()
, um die Anforderung / Antwort an die neue URL weiterzuleiten (serverseitige Umleitung, die nicht in der Adressleiste des Browsers angezeigt wird), oder wandeln Sie die eingehende WeiterleitungServletResponse
anHttpServletResponse
undHttpServletResponse#sendRedirect()
leiten Sie die Antwort an die neue URL um (clientseitige Umleitung, reflektiert in) Adressleiste des Browsers).web.xml
einemurl-pattern
von/*
oder/Check_License/*
, abhängig vom Kontextpfad, oder verwenden Sie@WebFilter
stattdessen die Annotation , wenn Sie bereits Servlet 3.0 verwenden.Vergessen Sie nicht , einen Scheck im Code hinzufügen , wenn die URL Bedarf geändert werden , und wenn nicht , dann rufen Sie einfach an
FilterChain#doFilter()
, sonst wird es nennt sich in einer Endlosschleife.Alternativ können Sie auch einfach eine vorhandene API eines Drittanbieters verwenden, um die gesamte Arbeit für Sie zu erledigen, z. B. UrlRewriteFilter von Tuckey , der wie bei Apache konfiguriert werden kann
mod_rewrite
.quelle
RequestDispatcher#forward()
ausgeführt wird, werden die restlichen Filter nicht ausgeführt. Also, wird es keinen besseren Weg geben, als dies als Servlet zu tun?<dispatcher>FORWARD</dispatcher>
zur Filterzuordnung hinzufügen .<dispatcher>FORWARD</dispatcher>
zur Filterzuordnung hinzufügen .Sie können den gebrauchsfertigen URL-Umschreibfilter mit einer Regel wie der folgenden verwenden:
Überprüfen Sie die Beispiele für weitere ... Beispiele.
quelle
Ein einfacher JSF Url Prettyfier-Filter, der auf den Schritten der Antwort von BalusC 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.
quelle