2016-08-17 7 views
0

Meine Feder-Controller sollte jede Anfrage Anfrage von jedem URI-Typ mit Ausnahme einer URI, die mit /resources/* begann, da dies der Aufruf ist, wenn ich nicht falsch bin, von Spring-Container zum Laden aller statischen Inhalt in Ansichtsseite getan.Wie ignoriert man ein bestimmtes URI-Muster im Frühjahr RequestMapping?

Aktuelle Konfiguration ist wie dies

@RequestMapping(method = RequestMethod.GET, value="/*") 

, die für die Anforderung mit URI adaequat / oder /example aber wenn jemand einen Tippfehler in URI zB machen. /example/random/char es wirft Ausnahme Spur Seite nicht gefunden (404), das ist ziemlich offensichtlich und führt mich value="/**"

@RequestMapping(method = RequestMethod.GET, value="/**") 

dann die Anforderung mit URI / oder /example sind nicht in der Lage zu machen, um meine statischen Inhalte .js, .css or .png Dateien in meiner Ansicht Seite zu laden . Dies führte mich zu der Schlussfolgerung, dass spring intern aufgerufen wird, diese Dateien mit einem URL-Muster zu laden. http://localhost:8080/resources/my.jpg.

Hinweis: - Ich entfernte absichtlich meinen Projektnamen, indem ich Tomcat konfigurierte.

Update Okay @dimitrisli Kommentar machen mich erkennen, dass ich ein wenig über mein Projekt ausarbeiten muss.

Es ist im Grunde eine URL-Umleitung Komponente. Ein Benutzer ruft einfach meine Anwendung durch get-Anfrage und beendet mit der Umleitung auf die aktuelle Seite.

Zum Beispiel Benutzer Anfrage mich werfen ihren Browser mit URL sagen wir http://localhost:8080/sample. Jetzt muss meine Anwendung die URL teilen, um die Zeichenfolge sample zu erhalten und in db nach der tatsächlichen URL suchen (also sample ist der Aliasname für eine wirklich lange URL). Wenn die URL existiert, wird sie auf die Seite der aktuellen Seite umgeleitet.

Antwort

1

(Update basierend auf Kommentare)

Dies ist, wie man mit 404 Fehlern umgehen kann.

Option 1

in web.xml gehören die folgenden auf der Hauptseite zu übermitteln:

<error-page> 
    <error-code>404</error-code> 
    <location>/</location> 
</error-page> 

oder Ihre individuelle Fehler bestimmten Seite:

<error-page> 
    <error-code>404</error-code> 
    <location>/my-custom-error-page</location> 
</error-page> 

Option 2

Definieren Sie eine Catch-all Fehlerbehandlung an der Schicht Controller:

@ExceptionHandler(Exception.class) 
public String handleAllExceptions(Exception e) { 
    log.error("There was an exception thrown! ", e); 
    return "index"; 
} 

Basierend auf den Namen des Ordners (Ressourcen) und Ihrer Beschreibung (js/css/.png ausschließen möchten) Ich gehe davon aus, dass Sie sich auf den statischen Inhalt Ihres Webprojekts beziehen.

Sie müssen explizit die statischen Inhalte in Ihrem dispatcher servlet xml wie folgt definieren (dem Verzeichnis Konvention des Projektes für statische Daten folgen):

<mvc:resources mapping="/resources/**" location="/resources/" /> 
<mvc:resources mapping="/css/**" location="/resources/css/" /> 
<mvc:resources mapping="/images/**" location="/resources/images/" /> 
<mvc:resources mapping="/js/**" location="/resources/js/" /> 
<mvc:resources mapping="/fonts/**" location="/resources/fonts/" /> 
+0

Vielen Dank für Ihre Antwort, aber das ist nicht meine Frage. Ich habe das schon gemacht. @Override public void addResourceHandlers (ResourceHandlerRegistry Registry) { \t \t registry.addResourceHandler ("/ resources/**") addResourceLocations ("/ Ressourcen /."); } – Satyaprakash

+0

Was genau ist Ihr Anliegen? Wenn Sie die Ressourcendetails definiert haben, wird der gesamte statische Inhalt von der Webanwendung bedient und geht nicht durch das @RequestMapping. – dimitrisli

+0

Ja, Sie haben recht, aber RequestMapping wird nicht durchlaufen, wenn value = "/ *", aber RequestMapping wird wann value = "/ **" – Satyaprakash

0

Es klingt wie Sie ein resource handler zu Ihrem Projekt hinzufügen müssen. Dadurch können Dateien in Ihrem Ordner /resources weitergeleitet werden. Hier ist ein weiterer post darüber mit einigen Beispielcode als Referenz.

registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");

Eine weitere Option kann einen Abfangjäger implementieren, die alle URIs fangen, bevor es zu einem Controller-Methode zu machen. Dies würde es Ihnen ermöglichen, etwas Logik hinzuzufügen, um sicherzustellen, dass Dinge in der DB existieren, bevor Sie tatsächlich Ihren Controller erreichen, anstatt eine einzige Controller-Methode zu haben, die alles tut. Erweitern HandlerInterceptorAdapter könnte etwas zu prüfen sein.

+0

Der erste Vorschlag, den "Resource Handler" zu konfigurieren, ist bereits vorhanden. Aber der zweite Vorschlag über "Interceptor" sieht sehr sinnvoll für mich aus. Ich muss es versuchen. Vielen Dank. – Satyaprakash

+0

Vielleicht auch versuchen, 'registry.setOrder (Ordered.HIGHEST_PRECEDENCE);' hinzuzufügen, um sicherzustellen, dass es die höchste Priorität hat. – itsthejash

+0

'registry.setOrder (Ordered.HIGHEST_PRECEDENCE);' hat nicht für mich funktioniert. Dies ist nützlich, wenn Sie mehrere Ressourcen verwalten müssen. – Satyaprakash

Verwandte Themen