Einstellung des Ansichtsnamens im Federfilter

9

Ich habe eine ErrorFilter , die die Feder GenericFilterBean erweitert. Ich möchte eine Fehlerseite anzeigen, die mit Kacheln versehen ist, wenn ein Fehler auftritt.

Gibt es eine Möglichkeit, einen Ansichtsnamen aus dem Filter festzulegen?

%Vor%

Dies ist die Konfiguration in web.xml und die doFilter Methode in errorfilter ist die folgende:

%Vor%

Die aktuelle Fehlerseite ist nicht mit Kacheln versehen, daher möchte ich sie mit der normalen Kopf- und Fußzeile dekorieren und diesen Ansichtsnamen aus dem Filter aufrufen.

Ist es möglich?

Bearbeiten: Grundsätzlich möchten wir etwas Ähnliches wie die Controller-Methode machen können, d. H. return "view name";

Bereits versucht:

  • Ссылка funktioniert nicht, es wird zu Ссылка umgeleitet
  • request.getRequestDispatcher ("errorPageView"). forward (Anfrage, Antwort); auch nicht, ähnlich wie oben (keine http-Weiterleitung, aber gibt den gleichen "keine solchen Seitenfehler" Inhalt)
coder247 01.09.2010, 09:47
quelle

5 Antworten

1

Ich denke, das ist nicht möglich, weil dies ein Servlet-Filter ist, der nach der Anwendung des Spring-Request-Mapper-Servlets angewendet würde. Das Anforderungszuordner-Servlet denkt also, dass es beendet ist, und übergibt die Anforderung zurück an den Servlet-Container.

Ansichtsnamen funktionieren nur innerhalb der Feder - außerhalb des Frühlings, im Servlet-Container müssen Sie über URLs sprechen, nicht Namen anzeigen.

Eine Umleitung zu einer bestimmten URL würde funktionieren. Dazu müssen Sie sich der Unterschiede zwischen einer Weiterleitung und einer Weiterleitung bewusst sein.

Eine Weiterleitung sendet den folgenden Header an den Client:

Ort: Ссылка

zusammen mit dem Statuscode 301 (permanente Weiterleitung, um dem Client mitzuteilen, dass diese Informationen zwischengespeichert werden können) oder 307 (temporäre Weiterleitung, um dem Kunden mitzuteilen, dass er das nächste Mal erneut fragen soll, weil sich die Weiterleitung ändern kann)

Die Weiterleitung auf dem Anforderungsdispatcher ahmt im Grunde eine neue Anforderung nach, und Sie können die Anforderung an JEDES Servlet im selben Container senden. das heißt, Sie müssen auch den Kontextpfad berücksichtigen, was die Antwort @iimuhin bedeutet:

%Vor%

ist eigentlich der richtige Weg. Sie können (sollten) eine Protokollierung hinzufügen, um zu sehen, was tatsächlich passiert und welche Pfade tatsächlich verwendet werden.

auch - Sie müssen sich der Pufferung bewusst sein. Eine Servlet-Antwort wird normalerweise gepuffert, und nichts wird an den Client gesendet, bis entweder der Puffer voll ist oder die gesamte Verarbeitung abgeschlossen ist.

Wenn es geleert wird, werden die Header zuerst geschrieben. das bedeutet, dass das Ändern der Header nach dem Löschen der Antwort nicht möglich ist, da sie bereits gesendet wurden.

Dies ist der Grund, warum Servlets das Spülen erzwingen können, aber normalerweise nicht.

In Ihrem Fall sollten Sie die Puffergröße für die Antwort erhöhen:

%Vor%

vor dem Aufruf von chain.doFilter (), um vorzeitiges Löschen zu vermeiden.

    
rmalchow 18.05.2015 05:34
quelle
1

Warum benutzen Sie nicht den Fehlerbehandlungsmechanismus von spring? hier der gute Beitrag dazu (mit Beispielen) - Ссылка

Abgesehen davon, nicht sicher, ob es einen sauberen Weg gibt, dies zu tun. Andere Vorschläge könnten einen Aufruf an Ihre Anwendung machen, um eine Fehlerseitenantwort zu erhalten und die Antwortausgabe mit dieser zu ersetzen (in diesem Fall müssen Sie auch eine "gepufferte" HTTP-Antwort verwenden, um sicher zu sein, dass der Stream noch nicht geleert wurde) oder make a Weiterleitung an die Fehler-URL.

    
Maks 20.05.2015 09:52
quelle
1

Der Filter kommt vor dem Frühling. Spring-Beans können mithilfe des ApplicationContextAware-Mechanismus in den Filter eingefügt werden. Wenn Sie jedoch eine Spring-MVC-Ansicht erstellen, müssen Sie das gesamte Feder-MVC-Framework in Ihrem Filter verwenden. Ich denke, das ist nicht möglich, und Sie müssen Anfrage mit RequestDispatcher nicht zu einer Spring-Ansicht, sondern zu Ihrer eigenen benutzerdefinierten Ansicht weiterleiten.

    
gargkshitiz 18.06.2015 12:51
quelle
0

Es muss einen Weg geben, es mit Spring MVC zu machen, aber ich denke, eine Umleitung ist genug.

%Vor%

P.S. Erhalte keinen Fehler!

    
Igor Mukhin 04.09.2010 20:09
quelle
0

Überprüfen Sie einfach Ihre Weiterleitungs-URL. Sie können auf die Seite mit der URL zugreifen.

%Vor%     
Vivek Adhikari 28.09.2015 10:25
quelle