
Ich möchte die URLs für den Zugriff auf eine Glassfish V3-Anwendung vereinfachen, indem ich Dateierweiterungen entferne und die URLs anderweitig kürze.
Ich habe meine Anwendung bereits als Standardanwendung festgelegt, sodass das Kontextstammverzeichnis nicht in die URL aufgenommen werden muss.
Ich möchte:
* Dateierweiterungen entfernen
* Die URL zu Dateien tief in der Ordnerstruktur verkürzen
Ich möchte dies mithilfe eines Mustervergleichs und nicht auf Dateibasis tun (die Site ist im Moment klein, wird sich aber häufig ändern und wachsen).
Einige Beispiele dessen, was ich tun möchte:
* foo.com/bar.html -> foo.com/bar
* foo.com/folder1/folder2/bar2.html -> foo.com/bar2
Für jede Hilfe wäre ich sehr dankbar. Danke.
Prost,
Jin
Antwort1
Genommen vonhttp://www.sun.com/bigadmin/sundocs/articles/urlrdn.jspes scheint, als wäre es das, wonach Sie suchen.
URL-Umleitung innerhalb einer Domain
Sie können das URL-Präfix-Element der redirect_-Eigenschaft verwenden, um eine URL an eine andere URL in derselben Domäne weiterzuleiten.
Das folgende Verfahren zeigt, wie Sie den Besuchern einer Website die Eingabe vonhttp://www.mywebsite.com/myproduct1und umgeleitet oder weitergeleitet werden anhttp://www.mywebsite.com/mywarname/products/myproduct1.jsp.
- Melden Sie sich bei der Admin-Konsole von Sun Java System Application Server oder GlassFish an.
- Erweitern Sie in der Admin-Konsole den Knoten „Konfigurationen“.
Erweitern Sie den Serverkonfigurationsknoten.
Ignorieren Sie diesen Schritt, wenn Sie eine Entwicklerdomäne ausführen (eine Domäne ohne Clustering-Funktion).
Erweitern Sie den HTTP-Dienst.
- Erweitern Sie „Virtuelle Server“.
- Klicken Sie auf Server.
- Klicken Sie auf der Seite „Virtuellen Server bearbeiten“ auf die Schaltfläche „Eigenschaft hinzufügen“.
- Geben Sie in der Spalte „Name“ ein
redirect_1
. Wenn Sie Anwendungsserver 9.0 verwenden, geben Sie den Wert
from=/<context-root>/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp
in die Spalte „Wert“ ein.Notiz– Der hier angegebene Wert
<context-root>
muss mit dem Wert des Kontextstamms übereinstimmen, der in der Datei web.xml oder application.xml angegeben ist.Wenn Sie Anwendungsserver 9.1 verwenden, geben Sie den Wert
from=/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp
in die Spalte „Wert“ ein.
Antwort2
In diesem Fall sollten Sie eine javax.servlet.Filter-Implementierung schreiben, die die verkürzten URLs erkennt und die Anfragen an das eigentliche Ziel weiterleitet.
/**
*
* @author vrg
*/
@WebFilter(filterName = "SimplifiedUrlRequestDispatcher", urlPatterns = {"/*"})
public class ShortenedUrlRequestDispatcher implements javax.servlet.Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//reading configuration from filterConfig
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String shortURI = httpRequest.getRequestURI();
String realURI = getRealURI(shortURI);
if (realURI == null) {
//in this case the filter should be transparent
chain.doFilter(request, response);
} else {
//forwarding request to the real URI:
RequestDispatcher rd = request.getRequestDispatcher(realURI);
rd.forward(request, response);
}
}
/**
* Calculates the real URI from the given URI if this is a shortened one,
* otherwise returns null.
* @param shortURI
* @return
*/
private String getRealURI(String shortURI) {
//TODO implement your own logic using regexp, or anything you like
return null;
}
@Override
public void destroy() {
}
}
Antwort3
Achtung! Ausgezeichnete Einführung, aber noch etwas – RequestDispatcher rd = request.getRequestDispatcher(realURI);
arbeitet mit dem Servlet-Pfad. Wenn die URI mit dem Anwendungsnamen abgerufen wird, tritt ein Fehler auf. Also – req.getServletPath()
gibt einen richtigen Pfad ohne Kontext aus und der Dispatcher funktioniert wie er soll.