JSF Login realisieren

Einen wunderschönen guten Morgen.

Ich versuche seit ein paar Tagen ein Login mit JSF hinzubekommen, jedoch klappt der Login nur begrenzt. Wenn ich eine neue Seite nach dem Login aufrufe, bin ich wieder ausgeloggt.

Entweder ich hab nen tierischen Denkfehler, oder ich hab irgendwas übersehen.

Meine Bean:
Java:
package meta.forum;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.*;
import java.util.logging.*;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;

@ManagedBean
@SessionScoped
public class User {

    private String username;
    private String password;
    
    // Verbindungsinformationen zur Datenbank
    
    private String driver = "com.mysql.jdbc.Driver";
    private String url = "jdbc:mysql://localhost:3306/forum";
    private String dbUser = "****";
    private String dbPass = "****";
    
    private static final String salt = "jk2eP0ls";
    
    public User() {
        
    }
    
    public void setUsername(String aUserName) {
        username = aUserName;
    }
    
    public String getUsername() {
        return username;
    }
    
    public void setPassword(String aPassWord) {
        password = aPassWord;
    }

    public String getPassword() {
        return password;
    }
    
    public String createUser() {
        //Verbindung zur Datenbank aufbauen
        try{
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, dbUser, dbPass);
           
            String qry = "INSERT INTO user VALUES(null, ?, ?)";
            PreparedStatement pstmt = con.prepareStatement(qry);
            pstmt.setString(1, username);
            String aPassword = pwSec(salt + password);
            pstmt.setString(2, aPassword);
            
            pstmt.executeUpdate();
            pstmt.close();
            con.close();
            
            return "index";
                        
        }catch(Exception ex){
            ex.printStackTrace();
            return null;
        }
        
    }
    
    public String login(){
        try{
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, dbUser, dbPass);
            
            String qry = "SELECT username, password FROM user WHERE username = ? AND password = ?";
            PreparedStatement pstmt = con.prepareStatement(qry);
            pstmt.setString(1, username);
            String aPassword = pwSec(salt + password);
            pstmt.setString(2, aPassword);
            
            ResultSet rs = pstmt.executeQuery();
            
            if(rs.next() && rs.getString("username") != null) {
                
                return "hallo";
            }else{
                return "fail";
            }
            
        }catch(Exception ex){
            ex.printStackTrace();
            return "fail";
        }
    }
    
    private String pwSec(String vPass) throws NoSuchAlgorithmException{
        /* Berechnung */
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(vPass.getBytes());
        byte[] result = md5.digest();

        /* Ausgabe */
        StringBuffer hexString = new StringBuffer();
        for (int i=0; i<result.length; i++) {
            hexString.append(Integer.toHexString(0xFF & result[i]));
        }
        return hexString.toString();
    }
}

Die index.xhtml
HTML:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Forum</title>
    </h:head>
    <h:body>
        <h:form>
            <h:panelGrid columns="2" border="0">
                Username: <h:inputText id="username" 
                                       value="#{user.username}"/>        
                Passwort: <h:inputSecret id="password"
                                         value="#{user.password}"/>
            </h:panelGrid>
            <h:commandButton id="submit" 
                             type="submit"
                             value="Login"
                             action="#{user.login}"/>
            <br />
            <h:commandLink id="create"
                            value="Neues Konto erstellen"
                            action="create.xhtml"/>
        </h:form>
    </h:body>
</html>

hallo.xhtml
HTML:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Login Erfolgreich :D <br/>
        Du bist eingeloggt als #{user.username}.
        <h:form>
            <h:commandLink id="create"
                            value="Weiter..."
                            action="test2.xhtml"/>
        </h:form>
    </h:body>
</html>

Sobald ich dann den Link folge, um auf die 2. Seite geworfen zu werden, werde ich ausgeloggt...
Dabei ist die 2. Seite fast identisch mit hallo.xhtml, es fehlt nur der Link.

Ist es nur nen einfacher denkfehler von mir und ich seh den Wald vor lauter Bäumen nicht, oder hab ich was gravierendes vergessen/ignoriert?

Schonmal vielen dank im vorraus.

Greetz,

Metamorphosis
 
HTML:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Test HP</title>
    </h:head>
    <h:body>
         #{user.username}.
    </h:body>
</html>

Meiner Meinung nach, müsst dann ja dort auch der Username stehen, aber das ist leider nicht der fall..
 
Deine USer-Bean ist nicht SessionScoped. Beim Wechsel auf die nächste Seite (test2.xhtml) wird eine neue Instanz der Klasse User angelegt, in der der Wert username noch nicht gesetzt ist. Wieso müsste ich mir genauer anschauen. Vermutlich wird sie nicht als EJB erkannt, weil dein Projekt keine beans.xml-Datei enthält oder ähnliches.
Wenn du statt des von dir importieren Pakets aber das Paket javax.faces.bean.SessionScoped nimmst, dann sollte es funktionieren, wie du es erwartest.

Gruß Fant
 

Zurück
Oben