Weiterleitung, wenn angemeldet

Smoothi

Bekanntes Mitglied
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

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

Smoothi

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

Was ich versucht habe:
Code:
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

Bekanntes Mitglied
hast du denn auch vorher folgendes durchgeführt?

Java:
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
 
S

Sym

Gast
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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:

Java:
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

Bekanntes Mitglied
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
Code:
<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

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

Code:
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
Code:
<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.
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben