Ich versuche einen Webfilter einzurichten und brauche Hilfe. Mein Filter funktioniert bei der ersten Anmeldung einwandfrei, aber wenn die Sitzung abgelaufen ist und ich auf einen Link klicke, wird meine Weiterleitungsanweisung ausgelöst, aber die Webseite im Browser wird nie umgeleitet. Kann jemand mit diesem Problem helfen? Sehr geschätzt.
Filter
%Vor%Faces-config.xml
%Vor%web.xml
%Vor%Authentifizieren Bean
%Vor% Ihr Filter sieht gut aus (abgesehen von dem sehr schwachen url.contains("login")
-Test und dem 2-fachen falschen Versuch, den Antwortstatus auf 301 zu setzen, und der etwas schlechten Art, einen eingeloggten Benutzer zu überprüfen).
Ich denke, dass Ihr konkretes Problem darin besteht, dass Sie eine Navigation durch Ajax-Links statt normaler Links durchführen. Sie können auf diese Weise keine Weiterleitung auf eine Ajax-Antwort senden. Weder die JSF-Ajax-Engine noch der Webbrowser folgen 302-Umleitungen auf JSF-Ajax-Antworten. Der Client endet mit einer Ajax-Antwort, die vollständig ignoriert wird.
Stattdessen sollten Sie eine spezielle XML-Antwort senden, die die JSF-Ajax-Engine anweist, eine Weiterleitung zu senden. Es ist genau diese XML-Antwort, wie sie gesendet wird, wenn sie innerhalb des JSF-Kontextes die ExternalContext#redirect()
wurde während einer Ajax-Anfrage verwendet.
Innerhalb des Servlet-Filters sollten Sie also zuerst prüfen, ob die Anfrage eine JSF-Ajax-Anfrage betrifft, und falls ja, dann geben Sie die obige XML-Antwort zurück, andernfalls rufen Sie einfach HttpServletResponse#sendRedirect()
auf die übliche Weise auf. Sie können das tun, indem Sie überprüfen, ob der Header Faces-Request
request vorhanden ist und gleich partial/ajax
ist.
Also, alles in allem sollte dein doFilter()
jetzt so aussehen:
Tags und Links authentication redirect jsf servlet-filters