DevMedia

Iniciante, tentando Login com Jsf e Servelet Filter.

0
Caros, desculpem-me pelo assunto massante.
Andei pesquisando em posts, video-aulas aqui da DevMedia e continuo com algumas dificuldades em fazer funcionar a validação da session do usuário.

Fiz uma pequena aplicação para testar.
vou postar meu código e, se ainda alguém resolver ajudar esse probre mortal, fico grato.

- Minha página index.xhtml, que é a página de login.
#Código
<?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>Login</title>
    </h:head>
    <h:body>
        <h:form>
            Usuario: <h:inputText value=#{loginMB.usuario}/><br/>
            Senha: <h:inputSecret value=#{loginMB.senha} /><br/>
            <h:commandButton value=Acessar action=#{loginMB.validar}/>
        </h:form>
    </h:body>
</html>


- Minha outra página a ser acessada ao efetuar o login, menu.xhtml.
#Código
<?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>Menu</title>
    </h:head>
    <h:body>
        <h1>
            Olá <h:outputText value=#{loginMB.usuario}/>, seja bem vindo!
        </h1>
    </h:body>
</html>


- Meu ManagedBean, loginMB.
Como podem ver, ele está com uma anotation de ManagedBean e SessionScoped.
A meu entender, a SessionScoped faz permanecer o objeto em todo o tempo da session do usuário.
Fiz bem simples, sem acesso a banco de dados. Apenas para testes.
#Código
package mypkg.bean;

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

@ManagedBean
@SessionScoped
public class loginMB {

    public loginMB(){
    }

    private String usuario;
    private String senha;

    public String getSenha() {
        return senha;
    }

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

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String validar(){
        if ( usuario.equals(user) && senha.equals(123) ){
            return menu;
        } else {
            return index;
        }
    }
}


- Meu Filter
#Código
package mypkg.filter;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AuthFilter implements Filter {

    public AuthFilter() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        Object userSession = req.getSession().getAttribute( <O que por aqui?> );
        if ( userSession != null || req.getRequestURL().toString().endsWith(index.jsf) ){
            chain.doFilter(request, response);
        } else {
            res.sendRedirect(index.jsf);
        }
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }
}


note que não sei mais o que fazer a partir daqui.
#Código
Object userSession = req.getSession().getAttribute( <O que por aqui?> );


- meu web.xml
#Código
<?xml version=1.0 encoding=UTF-8?>
<web-app version=3.0 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <filter>
        <filter-name>AuthFilter</filter-name>
        <filter-class>mypkg.filter.AuthFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AuthFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>
</web-app>



Resumo, tentando o acesso ao meu menu.jsf (index.xhml) diretamente pela URL eu sou jogado para a index.jsf (index.xhtml). Porém, não consigo fazer o controle da session do usuário.

Entendendo que o meu loginMB está configurado para durar toda a sessão do usuário, então acredito estar ele cadastrado na session, está?
Como posso fazer a partir de onde parei para poder aplicar o controle corretamente?

Desde já, muito grato por vossa atenção e boa vontade em ajudar!

Respostas (13)

0
Nossa!
Tive que editar no notepad para depois jogar aqui pois estava fazendo reload toda hora e eu perdendo o já digitado.
Ai, creio que é por isso que ficou desformatado desse jeito. Como edito o post?
0
Caros, desculpem-me pelo assunto massante.
Andei pesquisando em posts, video-aulas aqui da DevMedia e continuo com algumas dificuldades em fazer funcionar a validação da session do usuário.

Fiz uma pequena aplicação para testar.
vou postar meu código e, se ainda alguém resolver ajudar esse probre mortal, fico grato.

- Minha página index.xhtml, que é a página de login.

<?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>Login</title>
</h:head>
<h:body>
<h:form>
Usuario: <h:inputText value=#{loginMB.usuario}/><br/>
Senha: <h:inputSecret value=#{loginMB.senha} /><br/>
<h:commandButton value=Acessar action=#{loginMB.validar}/>
</h:form>
</h:body>
</html>
[/tagcod]

- Minha outra página a ser acessada ao efetuar o login, menu.xhtml.
[tagcod]
<?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>Menu</title>
</h:head>
<h:body>
<h1>
Olá <h:outputText value=#{loginMB.usuario}/>, seja bem vindo!
</h1>
</h:body>
</html>


- Meu ManagedBean, loginMB.
Como podem ver, ele está com uma anotation de ManagedBean e SessionScoped.
A meu entender, a SessionScoped faz permanecer o objeto em todo o tempo da session do usuário.
Fiz bem simples, sem acesso a banco de dados. Apenas para testes.

package mypkg.bean;

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

@ManagedBean
@SessionScoped
public class loginMB {

public loginMB(){
}

private String usuario;
private String senha;

public String getSenha() {
return senha;
}

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

public String getUsuario() {
return usuario;
}

public void setUsuario(String usuario) {
this.usuario = usuario;
}

public String validar(){
if ( usuario.equals(user) && senha.equals(123) ){
return menu;
} else {
return index;
}
}
}


- Meu Filter

package mypkg.filter;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AuthFilter implements Filter {

public AuthFilter() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;

Object userSession = req.getSession().getAttribute( <O que por aqui?> );
if ( userSession != null || req.getRequestURL().toString().endsWith(index.jsf) ){
chain.doFilter(request, response);
} else {
res.sendRedirect(index.jsf);
}
}

@Override
public void destroy() {
}

@Override
public void init(FilterConfig filterConfig) {
}
}



- note que não sei mais o que fazer a partir daqui.

Object userSession = req.getSession().getAttribute( <O que por aqui?> );



- meu web.xml

<?xml version=1.0 encoding=UTF-8?>
<web-app version=3.0 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>mypkg.filter.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsf</welcome-file>
</welcome-file-list>
</web-app>



Resumo, tentando o acesso ao meu menu.jsf (index.xhml) diretamente pela URL eu sou jogado para a index.jsf (index.xhtml). Porém, não consigo fazer o controle da session do usuário.

Entendendo que o meu loginMB está configurado para durar toda a sessão do usuário, então acredito estar ele cadastrado na session, está?
Como posso fazer a partir de onde parei para poder aplicar o controle corretamente?

Desde já, muito grato por vossa atenção e boa vontade em ajudar!
0
Estou só piorando a situação... rs ¬¬
Só para constar, estou usando JSF 2.0 com Netbeans 7.1.
0
Tranquilo Tiago
com relação a session que no codigo você colocou no filter você vai passar uma String que representa o atributo na Session.
Esse atributo pode ser um boolean que você seta ao fazer o login exemplo


@ManagedBean
@SessionScoped
public class loginMB {

public loginMB(){
}

private String usuario;
private String senha;

public String getSenha() {
return senha;
}

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

public String getUsuario() {
return usuario;
}

public void setUsuario(String usuario) {
this.usuario = usuario;
}

public String validar(){
if ( usuario.equals(user) && senha.equals(123) ){
((HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false)).setAttribute(logado, Boolean.TRUE);
return menu;
} else {
return index;
}
}

ai no filtro vc recupera o valor setado assim


public class AuthFilter implements Filter {

public AuthFilter() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;

Object userSession = req.getSession().getAttribute( logado );
if ( userSession != null&&((Boolean)userSession) || req.getRequestURL().toString().endsWith(index.jsf) ){
chain.doFilter(request, response);
} else {
res.sendRedirect(index.jsf);
}
}

@Override
public void destroy() {
}

@Override
public void init(FilterConfig filterConfig) {
}
}

espero ter ajudado.
att
robson
0
Ajudou totalmente Robson!
Muito obrigado meu caro!
Abraço!
0
É... estou entendendo mais sobre como armazenar informações na session.
Porém, preciso de outra ajuda. Se possível...

No primeiro acesso da página inicial, a de login, está entrando em um loop de redirect.
E não estou sabendo resolver.

Podem me ajudar?
0
tenta colocar um return logo apos o sendRedirect.
0
Não deu assim.
Mas consegui, mudando o web.xml

<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/main/*</url-pattern>
</filter-mapping>

Como já deixo a um direitório a mais, configurei para ser executado o servlet a partir dele.

Muito obrigado!
0
bacana tiago parabéns e obrigado por postar sua solução agora favor feche o chamado.
att
robson
0
Não tô sabendo como... ¬¬
0
na parte de cima perto da mensagem inicial ou da segunda mensagem nesté topico deve ter um link ou opção de fechar o chamado.
0
Opa !

Funcionou ?

Poderia fechar o chamado ? :D

Valeu !
0
Funcionou!
E desculpe não ter fechado ainda, mas não estou conseguindo encontrar opção para fechar!