Pessoal, boa tarde!
Sou iniciante em JSF, essa semana comecei a assistir alguns vídeos no Youtube sobre JSF, porém quando não começam a explicação do meio já começam usando uma porrada de frameworks e aí acaba sendo complicado aprender algo simples. Em todo caso estou tentando me virar com algumas coisas, porém estou com dificuldades em criar uma tela de login, na verdade, consigo criar uma tela de login a qual após digitar login e senha nos campos o usuário é redirecionado para a página que eu quero, porém se eu colocar essa página que somente deveria acessar após login no navegador, ele irá abrir sem problema algum.
Como faço para proteger essa página e outras que somente podem ser abertas se o usuário tiver logado?
Gostaria também de saber como posso usar sempre os dados do usuário logado nas páginas. Por exemplo, no JSP eu uso request.getSession().getAtribute(“login”), já em JSF eu realmente não sei, já que no JSP eu faço isso com Servlet.
Segue o código do meu UsuarioBean.java:
package bean;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import conexao.Conecta;
import modelo.Usuario;
@ManagedBean(name = "usuarioBean")
@RequestScoped
public class UsuarioBean {
private Usuario usuario = new Usuario();
FacesContext context = FacesContext.getCurrentInstance();
public String localizar() {
Conecta conecta = new Conecta();
Connection conexao = conecta.abreConexao();
PreparedStatement pstmLocaliza = null;
ResultSet resultado = null;
String sql = "SELECT * FROM usuario WHERE login = ? AND senha = ?";
try {
pstmLocaliza = conexao.prepareStatement(sql);
pstmLocaliza.setString(1, usuario.getLogin());
pstmLocaliza.setString(2, usuario.getSenha());
resultado = pstmLocaliza.executeQuery();
if (resultado.next()) {
usuario.setLogin(resultado.getString("login"));
usuario.setSenha(resultado.getString("senha"));
return "logado";
} else {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Login ou senha inválido!", ""));
return null;
}
} catch (SQLException e) {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Erro ao localizar registro. Mensagem: " + e.getMessage(), ""));
return null;
} finally {
try {
pstmLocaliza.close();
resultado.close();
conexao.close();
} catch (Throwable e) {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Erro ao fechar operação de Localização. Mensagem: " + e.getMessage(), ""));
return null;
}
}
}//fim localiza
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
}
Agora o código da minha página login.xhtml:
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Exemplo de JSF com banco de dados</title>
</h:head>
<h:body>
<h:messages/>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="login" value="Login"/>
<h:inputText name="login" value="#{usuarioBean.usuario.login}" required="true" requiredMessage="Digite o login!"/>
<h:outputLabel for="senha" value="Senha"/>
<h:inputSecret name="login" value="#{usuarioBean.usuario.senha}" required="true" requiredMessage="Digite o login!"/>
</h:panelGrid>
<h:commandButton id="cmdLogin" value="Logar" action="#{usuarioBean.localizar}"/>
</h:form>
</h:body>
</html>
E agora o código da pagina que somente deve aparecer se o usuário estiver logado, no caso eu chamei esta página de logado.xhtml por ser uma aplicação teste para aprendizado:
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Exemplo de JSF com banco de dados</title>
</h:head>
<h:body>
<div>
<h:outputText name="msg" value="#{usuarioBean.usuario.login}"/>
<br />
<h:inputText id="login" value="#{usuarioBean.usuario.login}"/>
</div>
</h:body>
</html>
Estou desde as 7 da manhã desde que acordei tentando ver isso sem sucesso. Eu vi usando um framework, fiz e deu certo, mas realmente não quero usar deste jeito, quero aproveitar e quando o usuário logar já manter alguns dados dele em um Session por exemplo, porém não sei como fazer isso também em JSF.
Ficarei muito grato se puderem me ajudar com esses problemas.
Desde já sou agradeço.