# Zugriff auf Session direkt auf JSF-Seite



## Raphalon (4. Aug 2011)

Hallo,

welche Lösungsmöglichkeit(en) gibt es für folgendes Problem: ein User hat sich eingeloggt (die Session ist also bereits erstellt). Nun soll auf jeder danach aufrufbaren JSF - Seite geprüft werden, ob ein User eingeloggt ist. Dies soll z.B. nicht erst *nach* Absenden des Formulars in einer Bean über "Security Roles" mittels @RolesAllowed("list-of-roles") geprüft werden, sondern die Seite selbst soll gar nicht erst angezeigt werden, wenn der User nicht eingeloggt ist.

In einer jsp-Seite könnte dies z.B. mittels folgendem Konstrukt erfolgen:

```
<c:if test="${empty sessionScope.user}"> 
    <c:redirect url="/index.jsp" /> 
</c:if>
```
Wie würde "man" das in JSF machen?

Gruß,

Raphalon


----------



## waldek87 (4. Aug 2011)

JSF ist ein View-Framework, daher sollte jegliche Logik in der View vermieden werden.

Tipp:
JSF PhaseListener – Is This User Logged In?  aaronbartell


----------



## Raphalon (9. Aug 2011)

OK, danke. Alternativ kann man auch SystemEvents verwenden. Man bindet sie in die jsf - Seite(n) ein z.B. mit 
[XML]<f:view>
   <f:event type="preRenderView" listener="#{userBean.verifyLogin}"/>  
   ...
</f:view>[/XML]
In der UserBean navigiert man dann bei fehlendem Login entsprechend:


```
public void verifyLogin(ComponentSystemEvent event) {
	if (!loggedIn) {
		FacesContext context = FacesContext.getCurrentInstance();
		ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
		handler.performNavigation("login");
	}
}
```
Wenn jedoch einmal ein Login erfolgt ist und eine Seite im Cache des ClientBrowsers ist, und man sendet nach einem Logout erneut z.B. Formulardaten an den Server, dann werden diese auch bearbeitet. Grund: der Login wie oben wird nur dann überprüft, wenn die jsf-Seite vom Server geladen wird. Daher müßte man zusätzlich die Beans absichern, die das Forumlar verarbeiten.


----------

