2010-03-24 3 views
6

UPDATE sind:Schreiben eines Servlets, die auf eine andere JSP wenn JSP exist und her überprüft, ob sie nicht

Um einen allgemeinen Fehler Fang zu klären, die 404 der fängt nicht genug Granularität für mich hat. Ich muss dies nur tun, wenn das JSP in einem bestimmten Verzeichnis ist und nur dann, wenn der Dateiname eine bestimmte Zeichenfolge enthält.

/UPDATE

ich mit dem Schreiben eines Servlets, das einen Aufruf und JSP dazwischen und in einem bestimmten Verzeichnis beauftragt habe überprüfen, dass die Datei vorhanden ist, und wenn es auf diese Datei nur nicht weiterleiten, wenn es Dann werde ich nicht zu einer Standard-JSP weiterleiten. Ich habe Setup die web.xml wie folgt:

<servlet> 
<description>This is the description of my J2EE component</description> 
<display-name>This is the display name of my J2EE component</display-name> 
<servlet-name>CustomJSPListener</servlet-name> 
<servlet-class> ... CustomJSPListener</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 
... 
<servlet-mapping> 
    <servlet-name>CustomJSPListener</servlet-name> 
    <url-pattern>/custom/*</url-pattern> 
</servlet-mapping> 

Und die Methode doGet des Servlets ist wie folgt:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    logger.debug(String.format("Intercepted a request for an item in the custom directory [%s]",request.getRequestURL().toString())); 
    String requestUri = request.getRequestURI(); 
      // Check that the file name contains a text string 
    if (requestUri.toLowerCase(Locale.UK).contains("someText")){ 
    logger.debug(String.format("We are interested in this file [%s]",requestUri)); 
    File file = new File(requestUri); 
    boolean fileExists = file.exists(); 
    logger.debug(String.format("Checking to see if file [%s] exists [%s].",requestUri,fileExists)); 
        // if the file exists just forward it to the file 
    if (fileExists){ 
    getServletConfig().getServletContext().getRequestDispatcher(
      requestUri).forward(request,response); 
    } else { 
        // Otherwise redirect to default.jsp 
    getServletConfig().getServletContext().getRequestDispatcher(
      "/custom/default.jsp").forward(request,response); 
    } 
    } else { 
        // We aren't responsible for checking this file exists just pass it on to the requeseted jsp 
    getServletConfig().getServletContext().getRequestDispatcher(
      requestUri).forward(request,response); 
    } 
} 

Dies scheint in einem Fehler 500 von Katers zu führen, ich glaube, Dies liegt daran, dass das Servlet in den gleichen Ordner umleitet, der dann vom Servlet erneut abgefangen wird, was zu einer Endlosschleife führt. Gibt es einen besseren Weg, dies zu tun? Ich bin der Meinung, dass ich dafür Filter verwenden könnte, aber ich weiß nicht viel über sie.

Antwort

8
File file = new File(requestUri); 

Das ist falsch. Die java.io.File kennt nichts über den Webapp-Kontext, in dem es ausgeführt wird. Der Dateipfad wird relativ zu dem aktuellen Arbeitsverzeichnis sein, das von der Art abhängt, wie Sie den Anwendungsserver starten. Es kann zum Beispiel relativ zu C:/Tomcat/bin eher als der Webapp-Root sein, wie Sie zu erwarten scheinen. Du willst das nicht haben.

Verwenden Sie ServletContext#getRealPath(), um einen relativen Webpfad in einen absoluten Dateisystempfad zu übersetzen. Das ServletContext ist in dem Servlet von der vererbten getServletContext()-Methode verfügbar. Daher soll nach der richtigen Datei hinweisen:

String absoluteFilePath = getServletContext().getRealPath(requestUri); 
File file = new File(absoluteFilePath); 

if (new File(absoluteFilePath).exists()) { 
    // ... 
} 

Oder, wenn der Zielbehälter den Krieg nicht auf System physischer Datenträger Datei nicht erweitern, sondern im Speicher, dann würden Sie besser nutzen ServletContext#getResource():

URL url = getServletContext().getResource(requestUri); 

if (url != null) { 
    // ... 
} 
+0

Danke, ich werde es versuchen. –

+0

Das hört immer noch nicht auf das Problem mit der Endlosschleife. –

+1

Fügen Sie ' REQUEST' dem '' hinzu. BTW: ein Filter ist in der Tat ein besserer Ort dafür, Sie können einfach den gleichen Code in die 'doFilter()', Sie müssen nur Anfrage und Antwort nach unten werfen. – BalusC

3

Dies kann viel einfacher und eingebauter Weise getan werden.

web.xml hat <error-page> Element. Sie können so etwas wie tun:

<error-page> 
    <error-code>404</error-code> 
    <location>/pageNotFound.jsp</location> 
<error-page> 
+0

Ich möchte nur, dass dies geschieht, wenn es in einem bestimmten Verzeichnis ist und der Dateiname eine bestimmte Zeichenfolge enthält. So ein Fang alle 404 hat nicht genug Granularität für mich. –

+0

Dann sehen Sie die Antwort von BalusC. – Bozho

0

Was ich tun würde, ist ein Dummy-Verzeichnis für die erste Servlet-Anfrage zu erstellen, und dann an das reale Verzeichnis oder an die 404-Typ-Seite weiterleiten. Sie geben trotzdem eine Weiterleitung aus, warum also nicht einfach in ein anderes Verzeichnis umleiten? Das würde Schleifenprobleme vermeiden.

+0

Ich habe darüber nachgedacht, aber ich kann das nicht tun, es muss leider im selben Verzeichnis wie die JSPs sein. –

Verwandte Themen