JSF Login per Ajax validieren. Was ist der Beste Weg?

Phenix

Bekanntes Mitglied
Hallo Zusammen,

die Frage, die ich habe bezieht sich ein wenig auf die Frage im Thema unter meinem, doch irgendwie auch nicht 100%ig.

Ich habe ein Form in dem der Benutzer seinen Nutzernamen und das Passwort angeben soll. Wenn auf den Button geklickt wird, soll überprüft werden ob der User existiert usw. Wenn der Login daneben läuft, soll eine Fehlermeldung angezeigt werden. Per Ajax!

Ich habe das folgendermaßen versucht:

Java:
<h:panelGroup layout="block" styleClass="iets">
                    <h:panelGrid columns="2" >
                        <h:form prependId="false" >
                            <h2>Benutzerbereich</h2>
                            <h:outputLabel value="Benutzername* " for="Benutzername" />
                            <p:keyboard required="true" id="Benutzername" showMode="button">
                                <p:ajax event="blur" update="growl" />
                            </p:keyboard>
                            <h:outputLabel value="Passwort* " for="Passwort" />
                            <p:keyboard password="true" id="Passwort" required="true" showMode="button">
                                <p:ajax event="blur" update="growl" />
                            </p:keyboard>
                            <p:commandButton ajax="true" value="Login" update="growl" actionListener="#{userController.checkUser}" >
                                <f:attribute name="username" value="Phenix" />
                                <f:attribute name="password" value="12345" />
                            </p:commandButton>
                        </h:form>
                    </h:panelGrid>
                </h:panelGroup>

Methode chechUser:

Java:
public void checkUser(ActionEvent event)
    {
        try
        {
            String username = (String) event.getComponent().getAttributes().get("username");
            String password = (String) event.getComponent().getAttributes().get("password");

            if (reader.checkUser(username, "USERNAME", password, "PASSWORD", "USERS"))
            {
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Erfolg", "Alles richtig eingegeben");
                throw new ValidatorException(msg);
            } else
            {
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Logindaten falsch", "Der eingegebene Benutzername oder das eingegebene Passwort war falsch.");
                throw new ValidatorException(msg);
            }
        } catch (CommunicatorException ex)
        {
            System.out.println(ex.getMessage());
        }
    }

Das Problem ist, dass die Nachrichten in der View nicht angezeigt werden. Auch die Verwendung von h:message hat nicht zum Erfolg geführt. Auf der Seite befindet sich ein p:growl (falls es euch bekannt ist). Am liebsten sollte dieses die Fehlermeldung anzeigen.

Außerdem: Wie kann ich die Werte an den ActionListener übergeben. Bisher passiert das ja statisch via
Code:
<f:attribute name="username" value="Phenix" />

Sorry, für diese Anfängerfrage, doch ich habe im Netz immer nur so umständliche Lösungen für so etwas gefunden.

Edit: Ich sollte vielleicht als Ergänzung anfügen, dass ich nicht direkt mit den Beans kommuniziere, sondern die Kommunikation immer über einen Controller läuft.
 
Zuletzt bearbeitet:

Phenix

Bekanntes Mitglied
Ok, ich habe es nun so gelöst. Ist es eine gute Idee, diese Logik in einem ActionListener abzuarbeiten oder sollte ich das besser anders lösen. was denkt ihr?

Java:
 <h:form prependId="false" >
                            <h2>Benutzerbereich</h2>
                            <h:outputLabel value="Benutzername* " for="Benutzername" />
                            <p:keyboard required="true" id="Benutzername" value="#{userBean.username}" showMode="button">
                                <p:ajax event="blur" update="growl" />
                            </p:keyboard>
                            <h:outputLabel value="Passwort* " for="Passwort" />
                            <p:keyboard password="true" id="Passwort" value="#{userBean.password}" required="true" showMode="button">
                                <p:ajax event="blur" update="growl" />
                            </p:keyboard>
                            <p:commandButton ajax="true" value="Login" update="growl" actionListener="#{userController.checkUser}" />
                        </h:form>


Java:
 public void checkUser(ActionEvent event)
    {
        try
        {
            FacesContext ctx = FacesContext.getCurrentInstance();
            UserBean user = (UserBean) ctx.getExternalContext().getSessionMap().get("userBean");

            if (reader.checkUser(user.getUsername(), "USERNAME", user.getPassword(), "PASSWORD", "USERS"))
            {
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Korrekt", "Korrekt eingeloggt");
                ctx.addMessage(null, msg);
                ctx.renderResponse();
            } else
            {
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Logindaten falsch", "Der eingegebene Benutzername oder das eingegebene Passwort war falsch.");
                ctx.addMessage(null, msg);
                ctx.renderResponse();
            }
        } catch (CommunicatorException ex)
        {
            System.out.println(ex.getMessage());
        }
    }

Noch eine Frage: Kann mir einer erklären, wie ich aus einem ActionListener heraus auf eine andere Seite navigiere? Ich habe gelesen, es soll auch ohne eine Navigationsregel möglich sein. Wie geht das?

Danke im Voraus
 

JanHH

Top Contributor
Mir kommt das nicht besonders gut vor. Du benutzt jede Menge direkte relativ "schmutzige" Funktionsaufrufe, auch um an die Werte zu kommen. Wie sauberes Softwaredesign sieht das eigentlich nicht aus. Und eigentlich macht man das mit JSF auch anders.

Ich kenn primefaces zwar kaum (arbeite selber mit richfaces), aber das Grundprinzip dürfte ja immer gleich sein. Generell unterscheidet sich die Variante, das mit ajax zu machen, eh nicht besonders von einem ganz normalen Form-Submit. Und wie man das im Standardfall implementieren würde, ist ja eigentlich klar, oder? Also dafür ist kein extra Beispeil nötig.

Warum kommunizierst Du denn nicht direkt mit den Beans? ich würde eine ActionBean "userController" nehmen, diese hat eine userBean als property und eine login-Funktion, damit geht das doch eigentlich straightforward.
 
Zuletzt bearbeitet:

Phenix

Bekanntes Mitglied
Hallo,

natürlich hast du recht. Ich habe das Ganze nun etwas überarbeitet. Der Controller hat nun eine Membervariable vom Typ UserBean und kann nun direkt darauf zugreifen.
Wenn sich der Benutzer nun erfolgreich einloggt, soll auf der gleichen Seite ein weiteres Menü gerendert werden, was halt nur eingeloggte Personen sehen können. Ich habe versucht es so zu realisieren, doch es wird nicht angezeigt:

Java:
    private UserBean user;

    public UserController()
    {
        user = new UserBean();
    }

    public void checkUser(ActionEvent event)
    {
        try
        {
            FacesContext ctx = FacesContext.getCurrentInstance();

            if (reader.checkUser(user.getUsername(), "USERNAME", user.getPassword(), "PASSWORD", "USERS"))
            {
                user.setCorrect(true);
                ctx.renderResponse();
            } else

Und in der View:

[XML]
<p:commandButton ajax="true" value="Login" update="growl,loggedIn" actionListener="#{userController.checkUser}" />
</h:form>
</h:panelGrid>
</h:panelGroup>
<h:panelGroup layout="block" id="loggedIn" rendered="#{userController.user.correct}">
<h:eek:utputText value="du bist eingeloggt!!!!!" />
</h:panelGroup>
[/XML]

Ne Idee?
 
S

Sym

Gast
In welchem Scope ist Deine Bean? Hast Du mal die Getter geprüft (z.B. über den Debugger)?

Ansonsten gestalte ich Loginseiten immer einzeln. Dann prüft ein PhaseListener, ob der Benutzer eingeloggt ist und redirected ggf. wieder auf die Loginseite.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Probleme mit Ajax Login (jsp) Web Tier 5
platofan23 Java Login Überprüfung ohne Srciptlets in der JSP Web Tier 4
F Formular nach erfolgreichem Login ausblenden Web Tier 0
S JSF Login mit redirect Web Tier 1
J JSF Login/Registrieren Feature mit JBoss AS 7.1.0 Web Tier 0
D Java EE Servlet login Problem Web Tier 1
Q JSF bei Session-Timeout Weiterleitung auf spezielle Login-Seite Web Tier 15
W JSF Login funktioniert nicht Web Tier 12
W JSF Komisches Verhalten nach Login per Realm Web Tier 4
M JSF Login realisieren Web Tier 4
T JSF Login? Web Tier 2
E Login mit JSF 2.0 und Glassfish 3.1.1 (in Netbeans 7.0.1) Web Tier 2
J JSF Mit Enter ein Login bestätigen? Web Tier 3
B JSF Login authentication schaffe ich nicht Web Tier 2
T JSP Session Login - Sicherheit Web Tier 4
D JSF 2.0 Login Web Tier 4
I Wie bekomme ich Angaben zum letzten Login Web Tier 2
K JSP Login Code Web Tier 14
D Login wie realisieren? Web Tier 12
J Problem mit Login Web Tier 4
G JSF h:form Tag Login über j_security_check und weiterleiten Web Tier 5
console MVC: Servletweiterleitung umgeht Login Authentifizierung Web Tier 2
D JSF+Weiterleitung zu einer Login-Page Web Tier 1
L JSP Tomcat Login Web Tier 6
T html login und apache client Web Tier 13
G WebSeite hinter einem Login auslesen Web Tier 8
D Login mit Filter (JSP/JSF) Web Tier 3
pkm Probleme mit einem AJAX-Call in einem dynamischen Webprojekt Web Tier 15
S AJAX/RestController Post Problem Web Tier 18
J JSF/JEE6 asynchronie Statusmeldungen per ajax Web Tier 1
J Funktion für AJAX - Problem mit Return Web Tier 14
D Servlet 1 Servlet für alles - Wie Cookies per Ajax? Web Tier 1
J Wicket: Füllen von Textarea via AJAX irgendwo auf der PAGE Web Tier 1
S JSF mit Ajax? Web Tier 3
V Wie baue ich eine Ajax Webanwendung? Suche Beispielanwendung (UML) eines AJAX Service Web Tier 0
P JSF Ajax aktualisiert Seite neu Web Tier 2
L JSF Composit Component mit ajax funktioniert nicht. Web Tier 4
M Ajax Fehler zur Laufzeit Web Tier 5
T JSF Primefaces: DataTable Ajax Update - Weiterleitung von anderer Seite Web Tier 11
S JSF SelectOneMenu - Probleme mit AJAX Web Tier 6
S JSF ComboBox mit JSF 2.0/ajax Web Tier 4
Kenan89 Class Funktion mit Ajax rufen Web Tier 13
P JSF tag "ajax" not found Web Tier 3
M JSF DataTable refreshen mit Ajax? Web Tier 5
R JSF Mit Ajax ganze Seite neu laden Web Tier 2
J Ajax ist undefiniert Web Tier 3
P JSF AJAX render wird nicht ausgeführt Web Tier 4
M JSF Ajax Command Link Web Tier 2
X Seite wird mit AJAX neu geladen Web Tier 4
J JSF AJAX-Aufruf ohne Komponente Web Tier 4
S Richfaces 4.0 Ajax Waitingpanel Web Tier 2
G JSF 2x h:selectManyCheckbox ohne duplikate Auswahl/selectManyCheckbox und f:ajax Web Tier 3
S Ajax Request verhindert forward? Web Tier 8
P JSF Ajax refresh nach Linkklick Web Tier 4
B Ajax JSON Objekt verschicken Web Tier 3
N Htmlunit Test mit Ajax Web Tier 2
D JSF Ajax mit Facelets (PrimeFaces) Web Tier 4
G mit Ajax ein Image vom Server holen Web Tier 2
J JSP und Ajax Web Tier 6
7 Struts+AJAX- Session-Handling? Web Tier 2
H Richfaces - Taglib Problem gelb unterstrichen Ajax Output Web Tier 6
S Framework, AJAX Drag and Drop Hilfe? Web Tier 2
H Welches Ajax Framework Web Tier 8
7 Struts und Ajax. Problem mit Actions Web Tier 2
F AJAX: Inhalt nachladen + load icon Web Tier 2
I AJAX - Problem Web Tier 18
I AJAX update Web Tier 2
T <f:ajax> in JSF2.0 Komponente ein- und ausblenden Web Tier 4
D [JSF] Center per Ajax wechseln Web Tier 3
D Ajax und Validation ohne große Umstrukturierung Web Tier 3
I Ajax DOM speichern Web Tier 27
V Image Map und Ajax-Richfaces Web Tier 5
J Ajax in MyFaces? Web Tier 6
K Orientierungslosigkeit: Webservice+Ajax(echo2)+Session-Management Web Tier 4
S Beschleunigung Verarbeitung, ...Ajax Client-Side? Web Tier 3
C RichFaces Ajax ReRender funktioniert nicht. Web Tier 2
T Ajax / Javascript Plugin für Eclipse Web Tier 1
G AJAX und J2EE Web Tier 6
J Validieren abhängiger Felder mit JEE6/Bean validation Web Tier 33

Ähnliche Java Themen

Neue Themen


Oben