Sessão JSF

4 respostas
Gerep

Olá pessoal,

Estou fazendo um sistema de login, pra aprender um pouco sobre o JSF com Faces, me disseram que é melhor que JSP, correto?

Bom, estou trabalhando da seguinte maneira:

Tenho uma pasta com três Controllers:

MainController;
HomeController;
LoginController;

Vou mostrar o conteúdo de cada um , ficou bem simples e vou ignorar os gets e sets para ficar mais fácil de visualizar ok?

MainController:

package com.erp3.gui.controllers;

import javax.faces.context.FacesContext;

public class MainController {

    public LoginController loginController;

    public MainController() {
        this.checkUserSession();
    }

    public String checkUserSession() {
        loginController = (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController");
        if (!loginController.getIsLoggedIn()) {
            return "login.html";
        } else {
            return null;
        }
    }
}

HomeController:

package com.erp3.gui.controllers;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
public class HomeController extends MainController {

    public String username;
    
    public HomeController() {
        super();
    }
}
LoginController:
package com.erp3.gui.controllers;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

@ManagedBean
public class LoginController {

    public Boolean isLoggedIn = false;
    private String username;
    private String password;
    private FacesMessage msg;

    public String login() {

        if (this.getUsername().equals("daniel") && this.getPassword().equals("123")) {
            this.isLoggedIn = true;
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("loginController", this);
            return "home.html";
        } else {
            this.isLoggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuário ou senha inválida.", username);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return "login.html";
        }
    }
    
    public String logOut() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("loginController");
        return "login.html";
    }
}
Então, fiz algumas pesquisas e vi esta maneira de criar uma sessão:
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("loginController", this);
, não sei se a maneira correta ou mais indicada ou quem sabe a única. O que acontece é que no meu MainController, eu verifico a existência desta sessão loginController para direcionar o usuário para o login.html caso não tenha sessão ativa. No meu arquivo master.xhtml tenho o seguinte código: *Exclui as tags HTML para facilidade de leitura.
<ui:fragment rendered="#{loginController.isLoggedIn}">
            <ui:include src="../includes/top.xhtml"/>
        </ui:fragment>
        <ui:insert name="body" />
        <hr />
        <ui:fragment rendered="#{loginController.isLoggedIn}">
            <ui:include src="../includes/footer.xhtml" />
        </ui:fragment>
Ou seja, verifiquei no meu Bean LoginController se a variável isLoggedIn é true ou false, isto esta funcionando perfeitamente, se eu tentar acessar a página home.xhtml sem fazer o login estes dois fragments não aparecem mas o conteúdo da página aparece e pelo que percebi, o meu arquivo MainController não esta executando a função checkUserSession como eu esperava.

Outra coisa, quando faço o login, sou direcionado para home.xhtml mas a URL não muda e se eu digitar na URL o caminho para home.html ele não mostra os fragments e em algumas vezes ele da um erro dizendo que não posso instanciar a classe HomController

Eu gostaria de saber também se quando eu chamo alguma página, por exemplo, home.xhtml, o Java executa o HomeController ou simplesmente abre o arquivo home.xhtml?

Alguma ideia?

Muito obrigado.

4 Respostas

R

coloca no main controller:

@ManagedBean

Gerep

@rmaragno

Muito obrigado pela resposta mas o problema continua o mesmo, a única mudança é que se antes de fazer o login eu tentar acessar a página home.xhtml, eu recebo o erro de não é possível instanciar a classe HomeController:

Cant instantiate class: com.erp3.gui.controllers.HomeController.
Gerep

Eu postei a minha dúvida no site http://stackoverflow.com/ e foi dada uma luz sobre o assunto.

http://stackoverflow.com/questions/10336732/jsf-login-session-and-redirect

L

muito obrigado pela referencia gerep!!

Criado 26 de abril de 2012
Ultima resposta 27 de abr. de 2012
Respostas 4
Participantes 3