# Weiterleitung, wenn angemeldet



## Smoothi (6. Dez 2011)

Die Startseite meiner Seite ist ein Loginformular.

Nun möchte ich, sobald man eingeloggt ist, automatisch zur eigentlichen Startseite weitergeleitet werden. Wie könnte ich das anstellen?

Gibt es da eventuell einen Trick mittels web.xml?


----------



## mjustin (6. Dez 2011)

Mit JSF? Dafür können zwei Elemente, <hanelgroup rendered="user.loggedIn"> ... </hanelgroup> bzw. <hanelgroup rendered="! user.loggedIn"> ... </hanelgroup> verwendet werden.


----------



## Smoothi (6. Dez 2011)

Naja... wie prüfe ich aber, ob der Benutzer eingeloggt ist?

Was ich versucht habe:

```
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
```

dann habe ich request.getUserPrincipal auf null geprüft, da es diesen ja nur geben sollte, wenn man eingeloggt ist

Leider funktionierte das nicht richtig.


----------



## krazun (6. Dez 2011)

hast du denn auch vorher folgendes durchgeführt?


```
request.login(this.loginUsername, this.loginPassword);
```

Bzw. nutzt du für Login/Authentifizierung auch JAAS (Java Authentication and Authorization Service) ?

Wenn das nicht der Fall ist und du den Login/Authentifizierung selbst geschrieben hast geht das mit dem getUserPrincipal nicht.

grüße,
krazun


----------



## Sym (6. Dez 2011)

Ja, das funktioniert nur, wenn Du auch eine entsprechende Anmeldung vornimmst. 

Wenn Du das händisch implementiert hast, könntest Du einen PhaseListener schreiben, der bei einem Request prüft, wo dieser herkommt und dann die Prüfung vornehmen.


----------



## Smoothi (7. Dez 2011)

habe es schon mit einem request.login gemacht  sprich ich nutze JAAS

ich hab das mit dem getUserPrincipal bereits an einer anderen Stelle genutzt... zum Beispiel bekomme ich ja nicht ohne Weiteres (zumindest ist mir das nicht bekannt wie ) den aktuell angemeldeten Benutzer mit all seinen Attributen.

Beispiel:
Ein Administrator hat eine Benutzerliste mit allen Benutzern und kann diese bearbeiten, löschen und neu anlegen. Da er nun nicht sich selbst löschen sollte, habe ich in der Abfrage (JPA, JPQL) genau diesen Benutzer ausgeschlossen. Den hab ich mir mit dem Principal geholt (da die Benutzernamen sowieso eindeutig sind).

Wenn es noch eine Möglichkeit gibt das Benutzer-Objekt (Entity-Klasse) DIREKT über den Login zu holen, nehme ich sie auch gerne.


----------



## krazun (7. Dez 2011)

naja du kannst die UserEntity ja beim Login in einem SessionScoped UserController setzen und dann jederzeit abfragen.

Mit JAAS kommst du auch jederzeit an den Usernamen des eingeloggten Benutzers:


```
FacesContext fc = FacesContext.getCurrentInstance();
			HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();

Principal principal = request.getUserPrincipal();
principal.getName()
```

über den Login-Namen kannst du ja auch jederzeit die UserEntity nachladen.

grüße,
krazun


----------



## Smoothi (7. Dez 2011)

ok...so habe ich es derzeit auch gemacht  Dachte, es geht vielleicht noch etwas angenehmer, sodass ich mir direkt wärend des Logins das nötige Objekt mit zurückgeben lassen kann, ohne eine separate JPQL-Abfrage abzuschicken 

Habe jetzt die Funktion nocheinmal implementiert.... das mit dem getUserPrincipal funktioniert anscheinend doch

Vielleicht war das Problem einfach die Weiterleitung.

Ich könnte ja ein <c:if> setzen und darin einen 

```
<meta http-equiv="refresh" content="0; URL=...">
```
setzen

könnte ich es auch Serverseitig machen? sodass die Seite garnicht erst an den Browser geschickt wird?

Die JSF-Seiten werden ja so oder so erst verarbeitet und dann abgesendet, wenn ich direkt am Anfang diese IF-Abfrage sende und darin eine Funktion aufrufe, die mich weiterleitet?!


----------



## Smoothi (7. Dez 2011)

ok, habs... hab mir einen kleinen Navigator gebastelt mit folgender Methode:


```
public void goTo(String site) {
        FacesContext fc = FacesContext.getCurrentInstance();
        fc.getApplication().getNavigationHandler().handleNavigation(fc, null, site + ".xhtml?faces-redirect=true");
    }
```

und das Ganze dann wie folgt aufgerufen

```
<h:outputFormat rendered="#{loginPM.checkLogin()}">
        #{navigatorPM.goTo('start')}
</h:outputFormat>
```

Wollte eigentlich <c:if> probieren, ging aber nicht... <c:choose> und <c:when> klappte ebenfalls nicht :/

EDIT: Leider ist diese Möglichkeit schlecht, da die Seite im Browsercache verweilt -.- und nur mittels "F5" das gewollte Ergebnis zustande kommt.


----------

