2012-06-05 6 views
6

Entwickeln einer Webanwendung in Java EE mit JSF. Alle Seiten sind vom Authentifizierungsformular mit der Aktion 'j_security_check' gesichert und geben 'j_username' und 'j_password' ein.Falsche Weiterleitung nach dem Anmelden (Java EE mit JSF)

Nach dem erfolgreichen Login, aber ich wollte ich nicht auf die Seite umgeleitet zuzugreifen, aber auf diese URL

/faces/javax.faces.resource/jsf.js?ln=javax.faces&stage=Development 

So an der mit allen JS Code Skriptdatei Ich bin auf der Suche jsf.js anstatt der Seite, die ich sehen wollte. Es spielt keine Rolle, ob ich auf den Webstamm oder eine andere Seite zugreife, ich werde jedes Mal auf diese URL umgeleitet. Dann habe ich die URL zu einer beliebigen Seite zu ändern, es lädt es gut und ich bin angemeldet.

Ich muss sagen, dass ich schon dieses Problem hatte, die auf magische Weise ging weg, so dass es mich richtig umgeleitet. Nach ein paar Wochen wurde es wieder kaputt, aber ich tat es nicht, wenn es meine Schuld war, und wenn es war, kenne ich die Ursache nicht. Ich habe mich nicht mit Umleitungsregeln oder Navigationsregeln herumgeschlagen.

Gut zu erwähnen, dass ich auch PrettyFaces benutze.

EDIT:

<security-constraint> 
    <display-name>secured</display-name> 
    <web-resource-collection> 
     <web-resource-name>all</web-resource-name> 
     <description/> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
     <role-name>teacher</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>secured for admins</display-name> 
    <web-resource-collection> 
     <web-resource-name>admin pages</web-resource-name> 
     <description/> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>unsecured</display-name> 
    <web-resource-collection> 
     <web-resource-name>css</web-resource-name> 
     <description/> 
     <url-pattern>/css/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>js</web-resource-name> 
     <description/> 
     <url-pattern>/js/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>img</web-resource-name> 
     <description/> 
     <url-pattern>/img/*</url-pattern> 
    </web-resource-collection> 
</security-constraint> 
<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>wetk-security</realm-name> 
    <form-login-config> 
     <form-login-page>/faces/login.xhtml</form-login-page> 
     <form-error-page>/faces/login.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 
+0

Was im ' ist' Elemente Ihrer 'web.xml' Datei? –

+0

Bearbeitete die Frage. – redhead

Antwort

8

Die Containersicherheit verwaltet wird zur letzten HTTP-Anforderung umleiten, die die Authentifizierungsprüfung ausgelöst. In Ihrem Fall ist es anscheinend die automatisch enthaltene JSF Ajax API JavaScript-Datei. Dies kann passieren, wenn der Browser die zu authentifizierende Seite vollständig aus dem Browser-Cache geladen hat, während der Browser die JS-Datei vollständig von der Serverseite geladen hat, oder die Cache-Gültigkeit der JavaScript-Datei durch eine bedingte GET-Anfrage getestet hat .

Sie möchten die JSF-Ressourcen auszuschließen (<h:outputScript>, <h:outputStylesheet> und <h:graphicImage> von Authentifizierung überprüft. Sie könnten das tun /javax.faces.resource/* das gemeinsame URL-Muster durch Ausschluss. Sie nur die /faces Präfixmuster möchten hinzufügen, wie Sie offensichtlich sind indem er anstelle der *.xhtml Suffixmuster.

Sie müssen auch den Browser zu nicht Cache beschränkten Seiten anweisen, den Browser Laden zu verhindern, dass es aus dem Cache (zB durch Taste nach dem Abmelden zurück~~POS=TRUNC). Ordnen Sie die folgenden Filter auf demselben URL-Muster wie das Ihrer <security-constraint>.

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint> 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) request; 
     HttpServletResponse httpRes = (HttpServletResponse) response; 

     if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      httpRes.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 
+0

Also habe ich Ihren Code ausprobiert und im Login-Prozess (die erste Anfrage und nach dem Senden des Formulars) erhält der Filter nie die angeforderte Seite. Es empfängt es nur, wenn ich die URL erneut ändere. Also, funktioniert nicht wieder, ich sehe immer noch das JS-Skript. – redhead

+0

Haben Sie den Browser-Cache vor dem Testen gelöscht? – BalusC

+0

Ich habe eine komplett abgeräumte Opera versucht aber keine Veränderung. – redhead