Como abrir uma nova página após uma validação de login

Opa, olá.

Vou direto ao ponto: quero abrir uma página home.xhtml após clicar no botão de login de uma página login.xhtml. Entretanto, só posso abrir a página home.xhtml se o login estiver válido, sendo que possuo uma tabela users com as colunas (id - username - password) e a página login.xhtml possui inputs de texto que pegam o username e a password da tabela. Aqui segue o meu arquivo XHTML e minha managed bean.

ManagedBean - UserBean:

private String nome;
private String senha;
private SessionManager sessionManager = new SessionManager();

public UserBean() {
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public String getSenha() {
	return senha;
}

public void setSenha(String senha) {
	this.senha = senha;
}

public void loginUser() {
	// Gostaria de fazer a lógica de login aqui.
}

}

XHTML - login.xhtml:
https://pastebin.com/PZvdBjGM

Desde já agradeço :slight_smile:

Você vai precisar realizar um select pelo username e senha.
Então, se estiver tudo ok, invoca:

FacesContext.getCurrentInstance().getExternalContext().redirect("pagina_que_quero");
1 curtida

No caso está tudo certo no select. Entretanto eu devo botar o “pagina_que_quero” com o caminho completo? Só o nome? Com “.xhtml”? Como seria?

Já resolvi. Agora ficou uma outra dúvida: como eu faço pra utilizar a String que eu botei no input do username na página home.xhtml? Eu só quero inserir uma mensagem dizendo “Bem-vindo, <usuário>!”.

Neste caso, você tem algumas opções:

  • Usar sessão
  • Passar a variável para a página, referenciando, neste xhtml, o managed bean em que fez o login.

Cara, perdoe-me mas eu não entendi. Poderia me dar mais detalhes?

O que você não entendeu?

Já resolvi, muito obrigado. :slight_smile:

Poste a resolução, para ajudar outros usuários que tiverem o mesmo problema que o seu. Assim, além de você ser ajudado, você ajuda outros posteriormente. :heart:

1 curtida

Eu utilizei um segundo Managed Bean (ex. UserLoggedInfo, nome que dei a esse segundo MB) que recebia as informações do primeiro Managed Bean (isto é um Injection, em outras palavras).

Managed Bean principal (UserBean):

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

@ManagedBean(name="userBean")
@SessionScoped

public class UserBean {

	private String nome;
	private String senha;

	public UserBean() {}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public void registerUser() {
        //regras de negócio do register
	}
	
	public boolean loginUser() {
		//regras de negócio do login
	}
}

Como eu fiz o outro Managed Bean para acessar o campo? Simples:
Managed Bean UserLoggedInfo:

package br.com.benoit.application.managedbean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

@ManagedBean (name = "userLoggedInfo")
@ViewScoped //necessita desta anotação
public class UserLogedInfo {

    //Aqui você diz que utilizara as propriedades do outro managedbean.
	@ManagedProperty(value="#{userBean}")
	private UserBean userBean;
	
	public UserBean getUserBean() {
		return userBean;
	}

	public void setUserBean(UserBean userBean) {
		this.userBean = userBean;
	}

}

E como utilizar na View? Faça da seguinte forma:
View (ou tela) login.xhtml:

<!-- Omitindo as outras tags (espera-se que tenha conhecimento delas)-->
<!-- ATENÇÃO, ESTOU UTILIZANDO JSF COM IMPLEMENTAÇÃO PRIME FACES -->
<h:body>
	<h:form>
		<p:panel header="Insira o nome de usuário e senha para validar o login:">
		
			<h:panelGrid>
				<p:outputLabel>Insira o nome do usuário:</p:outputLabel>
				<p:inputText value="#{userBean.nome}" />
			</h:panelGrid>

			<h:panelGrid>
				<p:outputLabel>Insira a senha do usuário:</p:outputLabel>
				<p:inputText value="#{userBean.senha}" />
			</h:panelGrid>
			
            <!-- Aqui estará o botão que é o gatilho para o método de login -->
			<h:panelGrid>
				<p:commandButton value="Entrar"
					actionListener="#{userBean.loginUser}"/>
			</h:panelGrid>
			
		</p:panel>
	</h:form>
</h:body>

E para utilizar a propriedade no outra tela, utiliza-se:
View (ou tela) home.xhtml:

<!-- Omitindo as outras tags (espera-se que tenha conhecimento delas)-->
<!-- ATENÇÃO, ESTOU UTILIZANDO JSF COM IMPLEMENTAÇÃO PRIME FACES -->
<h:body>
	<p:outputLabel value="Bem-vindo, #{userLogedInfo.userBean.nome}!"></p:outputLabel>
</h:body>

Obrigado ao colega @smatt por ter me alertado. :slight_smile:
SE VOCÊ FICAR COM ALGUMA DÚVIDA, POR FAVOR ME MANDA UMA MENSAGEM, ESTAREI GRATO EM AJUDÁ-LO. :blush:

1 curtida