Wie verwende ich einen Servlet-Filter in Java, um eine eingehende Servlet-Anfrage-URL zu ändern?
Wie kann ich ein servlet-filter zu ändern servlet eine eingehende Anfrage-url von
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: nach BalusC die Schritte unten, ich kam mit dem folgenden code:
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() {
//
}
}
Den entsprechenden Eintrag in web.xml
wie folgt Aussehen:
<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 versucht, sowohl die server-Seite und client-Seite umleiten, mit den erwarteten Ergebnissen. Es funktionierte, Dank BalusC!
InformationsquelleAutor der Frage Frank | 2010-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
javax.- servlet.- Filter
.doFilter()
Methode, warf der eingehendenServletRequest
zuHttpServletRequest
.HttpServletRequest#getRequestURI()
zu schnappen Sie sich den Pfad.java.lang.String
Methoden wiesubstring()
split()
concat()
und so weiter zu extrahieren, die Teil des Interesses und schreiben den neuen Pfad.ServletRequest#getRequestDispatcher()
und dannRequestDispatcher#forward()
weiterleiten der Anfrage - /Antwort-auf die neue URL (server-side-redirect, spiegelt sich nicht in der browser-Adressleiste), oder Besetzung der eingehendenServletResponse
zuHttpServletResponse
und dannHttpServletResponse#sendRedirect()
leiten Sie die Antwort auf die neue URL (client-Seite umzuleiten, die sich in browser-Adressleiste).web.xml
auf eineurl-pattern
von/*
oder/Check_License/*
je nach Kontext-Pfad, oder, wenn Sie auf Servlet 3.0 bereits, verwenden Sie die@WebFilter
- Anmerkung für die, die statt.Vergessen Sie nicht, fügen Sie eine überprüfung im code, ob die URL muss geändert werden, und wenn nichtdann rufen Sie einfach
FilterChain#doFilter()
sonst ruft sich in einer Endlosschleife.Alternativ können Sie auch nur die Nutzung einer vorhandenen 3rd-party-API zu tun, die ganze Arbeit für Sie, wie Tuckey ' s UrlRewriteFilterdie konfiguriert werden können, die Art und Weise, wie mit Apache
mod_rewrite
.InformationsquelleAutor der Antwort BalusC
Könnten Sie die gebrauchsfertige Url-Rewrite Filter mit einer Regel wie dieser hier:
Überprüfen Sie die Beispiele für mehr... Beispiele.
InformationsquelleAutor der Antwort Pascal Thivent
Einer einfachen JSF Url Prettyfier filter basiert, die in den Schritten BalusC Antwort. Der filter leitet alle Anfragen beginnend mit der /ui-Pfad (vorausgesetzt, Sie haben alle Ihre xhtml-Dateien dort gespeichert) auf den gleichen Pfad, aber das hinzufügen der xhtml-suffix.
InformationsquelleAutor der Antwort Xtreme Biker
Bitte beachten Sie, dass wenn Sie Ihre original-URL enthält Parameter, d.h. http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123?param1=A¶m2=B dann diese Parameter werden auch weitergeleitet zur nächsten servlet/jsp.
Ich habe nicht einen Weg finden, um loszuwerden, oder ersetzen Sie original-Parameter (nur mit HttpServletRequestWrapper). Irgendwelche Ideen?..
Update: es scheint, dass http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ behebt dieses problem.
InformationsquelleAutor der Antwort Lopotun