StackOverflowError in der servlet-mapping url-pattern "/*"
Habe ich eine Reihe von JSP-Seiten, und ich möchte zu verstecken .jsp-Erweiterung (nach ein bisschen recherche scheint es, ist es gut für SEO).
Einer Lösung, die ich stieß, war das folgende:
<servlet>
<servlet-name>mypage</servlet-name>
<jsp-file>/some-page.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>mypage</servlet-name>
<url-pattern>/some-page</url-pattern>
</servlet-mapping>
Und das funktioniert zwar, ich glaube, ich habe diese Zuordnung für jede jsp-Seite auf meiner Website.
Stieß ich auf eine andere Lösung hier gepostet (Einfach freundliche URL ' s): Versteckte Funktionen von JSP - /Servlet -
... was nutzt ein einfaches servlet zum weiterleiten der Anforderung. In meinem web.xml ich habe Folgendes und es funktioniert gut:
<servlet>
<servlet-name>MyServletName</servlet-name>
<servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/myservlet/*</url-pattern>
</servlet-mapping>
Nun das problem ist, ich will nicht zu schlagen die URL: www.mydomain.com/myservlet/some-page
Ich wollen, verwenden Sie die URL: www.mydomain.com/some-page
Also habe ich das url-pattern "/*"
<servlet>
<servlet-name>MyServletName</servlet-name>
<servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Aber das verursacht eine Endlosschleife:
Exception in thread "http-bio-8080-exec-1" java.lang.StackOverflowError
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:219)
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
.
.
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at myservlets.PrettyUrlServlet.doGet(PrettyUrlServlet.java:22)
Denen ich mir nicht sicher, wie Sie Sie zu beheben. Irgendwelche Ideen?
InformationsquelleAutor nogridbag | 2012-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem servlet, welches abgebildet ist auf
/*
laufen auch aufRequestDispatcher#forward()
Anrufe. Also, wenn Sie ausführen einer vorwärts-in, servlet, es würde sich jedes mal in einer Endlosschleife. Das erklärt dieStackOverflowError
.Nach allem, sollten Sie nicht verwenden
/*
für servlets überhaupt. Es macht nur Sinn auf der servlet-Filter. Setzen Sie die servlet-mapping wieder auf eine bestimmte URL-Muster und erstellen Sie einen filter auf/*
übermittelt, um das gewünschte servlet, wenn nötig. Sie natürlich nicht wollen, um das servlet zu behandeln, zum Beispiel Bilder/CSS/JS-Dateien. Unter der Annahme, dass Sie alle in/resources
Ordner und, dass die front-controller zugeordnet ist, auf/myservlet/*
, dann folgende Aufgabe indoFilter()
:Siehe auch:
Du bist herzlich willkommen.
Dumme Frage. Ich selbst muss das servlet in den ersten Platz? Kann der filter nach vorne direkt auf die jsp-Seiten?
Wenn die einzige funktionale Anforderung ist "pretty URLs" und nicht "front-controller", dann können Sie alleine verwenden einen filter, ja. Es gibt auch 3rd-party-Bibliotheken für diese wie Tuckey ' s URLRewriteFilter und Umschreiben, die ähnlich wie Apache HTTPD ist
mod_rewrite
. Aber wenn Sie wirklich brauchen einen front-controller (was auch zu der Behandlung von HTTP-request-Vorbereitung und postporocessing), besser halten Sie es in der servlet.InformationsquelleAutor BalusC
Sollten Sie verwenden UrlRewriteFilter
Könnten Sie einige dieser Konfigurationsdatei(urlrewrite.xml):
UrlRewriteFilter ist auf den einen Kommentar, aber ich denke es sollte eine unabhängige Antwort.
InformationsquelleAutor Steven Lizarazo