2012-03-26 7 views
2

Ich verwende Tomcat 5.5.4 und lasse ein Servlet ohne Probleme laufen. Ich möchte jedoch ein Mapping einrichten, um das Servlet nur zu starten, wenn eine URL mit einer bestimmten Abfragezeichenfolge übergeben wird.Wie gebe ich eine Abfragezeichenfolge in Tomcat <Servlet-Mapping><url-pattern>?

Gerade jetzt in web.xml habe ich: <servlet-mapping> <servlet-name>MyServer</servlet-name> <url-pattern>/go/*</url-pattern> </servlet-mapping>

Wenn ein Browser http://localhost/MyServer/go?P=123 macht die Servlet gestartet wird und alles ist gut. Allerdings möchte ich dieses Servlet nur starten, wenn die URL genau so ist, wie sie gerade angezeigt wird. Leider wird im Moment, wenn die URL http://localhost/MyServer/go?P=AnyDarnThing ist, das Servlet noch gestartet. Ich habe versucht, folgendes einzurichten: <url-pattern>/go?P=123</url-pattern> , aber dies führt zu Die angeforderte Ressource (/ MyServer/go) ist nicht verfügbar.

Ich habe zahlreiche Variationen (Zitat der Zeichenfolge, ...) auf dem obigen URL-Muster versucht, aber ich bekomme immer den obigen Fehler. Ich merke das, wenn ich (zu Debugging-Zwecken) das "?" wie in <url-pattern>/goP=123</url-pattern> Ich bekomme nicht mehr die Fehlermeldung und der Server startet (aber natürlich reagiert es nicht auf die "Query String", weil es nicht richtig gebildet ist.) Dies deutet darauf hin, dass das "?" verursacht ein Problem beim Mapping. Ich habe versucht, es durch sein URL-Sonderzeichen zu ersetzen, das wie folgt äquivalent ist: <url-pattern>/go%3FP=123</url-pattern> aber das gibt das selbe Ergebnis gerade oben beschrieben, als ich versuchte, das "?" insgesamt.

Ich realisiere, dass ich das Servlet starten lassen kann, wenn ein beliebiger Abfrage-String übergeben wird, und dann die Anfrage für alle außer dem, den ich interessiere, "ignoriere", aber es gibt einen Grund, warum ich das Servlet nicht gestartet haben möchte anfangen mit. Also, meine Frage ist, wie kann ich das Servlet so konfigurieren, dass es nur gestartet wird, wenn eine bestimmte Abfragezeichenfolge enthalten ist?

Vielen Dank.

+0

Siehe auch [Ungültige URL-Muster Servletzuordnung in Tomcat 6.0] (http://StackOverflow.com/Questions/26732) – McDowell

Antwort

1

Sie können dies nicht mithilfe von URL-Mustern tun.

Sie können dies mit Filtern erreichen. Implementieren Sie einen Filter, der nur dann an das Servlet weitergeleitet wird, wenn die Abfrageparameter vorhanden sind.

Hier ist das, wie die Filter aussehen werden: im web.xml wie diese

public class ServletAcessFilter implements Filter 
{ 
    public void init(FilterConfig filterConfig) throws ServletException 
    { 

    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
    FilterChain filterChain) throws IOException, ServletException 
    { 
    //validate the request, check if the request can be forwarded to servlet. 
    if(request.getParameter("P").equalsIgnoreCase("123")){ 
     filterChain.doFilter(request, response); 
    } else { 
     //write what you want to do if the request has no access 
     //below code will write 404 not found, you can do based on your requirement 
     HttpServletResponse httpResponse = (HttpServletResponse) response; 
     httpResponse.setStatus(404); 
    } 
    } 

    public void destroy() 
    { 

    } 
} 

Definieren Sie die Filter:

<filter> 
    <filter-name>ServletAccessFilter</filter-name> 
    <filter-class>com.ServletAcessFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ServletAccessFilter</filter-name> 
    <url-pattern>/go/*</url-pattern> 
</filter-mapping> 
+0

Ich bin nicht mit Filtern vertraut. Können Sie mir eine Ressource vorschlagen, in der ich lernen könnte, einen Filter dafür zu schreiben? (Oder, wenn der Filter wirklich einfach ist, können Sie mir zeigen, wie es aussieht?) Danke. –

+0

hat den Filter hinzugefügt, bitte lassen Sie mich wissen, wenn Sie Hilfe brauchen –

+0

Vielen Dank Ramesh! Ich weiß es zu schätzen, dass Sie sich die Zeit genommen haben, den Code zu schreiben. Ich werde es versuchen. Danke noch einmal. –

3

Sie können das nicht tun. Die url-pattern ist ziemlich begrenzt.

Wenn Sie verschiedene Aktionen basierend auf einem GET-Parameter ausführen möchten, können Sie dies manuell tun. In der doGet() Methode des Servlets haben Sie eine einfache if -Klausel und rufen verschiedene Methoden auf, abhängig von der Abfrage string/get param.

+0

Ja, aber ich versuchte zu vermeiden, die Logik in das Servlet selbst zu schreiben. Vielen Dank. –

1

zu Bozho Antwort hinzuzufügen, können Sie auch zu bewegen versuchen, Clean URLs

Dies wird erheblich Ihre Optionen in Bezug auf URL Pattern-Matching erhöhen und vor allem deutlich Konfiguration eines Front Reverse-Proxy erleichtern kann, wenn Du brauchst jemals einen.

+0

Danke für diesen Vorschlag. Unabhängig von meiner Frage, das sieht nach einer guten Idee aus! –