Wie kann ich URLs in Glassfish V3 umschreiben/umleiten?

Wie kann ich URLs in Glassfish V3 umschreiben/umleiten?

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.

  1. Melden Sie sich bei der Admin-Konsole von Sun Java System Application Server oder GlassFish an.
  2. Erweitern Sie in der Admin-Konsole den Knoten „Konfigurationen“.
  3. Erweitern Sie den Serverkonfigurationsknoten.

    Ignorieren Sie diesen Schritt, wenn Sie eine Entwicklerdomäne ausführen (eine Domäne ohne Clustering-Funktion).

  4. Erweitern Sie den HTTP-Dienst.

  5. Erweitern Sie „Virtuelle Server“.
  6. Klicken Sie auf Server.
  7. Klicken Sie auf der Seite „Virtuellen Server bearbeiten“ auf die Schaltfläche „Eigenschaft hinzufügen“.
  8. Geben Sie in der Spalte „Name“ ein redirect_1.
  9. Wenn Sie Anwendungsserver 9.0 verwenden, geben Sie den Wert from=/<context-root>/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jspin 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.jspin 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.

verwandte Informationen