Iniciante, tentando Login com Jsf e Servelet Filter.

27/02/2012

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>


- Minha outra página a ser acessada ao efetuar o login, menu.xhtml.
<?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!
Tiago Silva

Tiago Silva

Responder

Posts

27/02/2012

Tiago Silva

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?
Responder

27/02/2012

Tiago Silva

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>
[/code]

- Minha outra página a ser acessada ao efetuar o login, menu.xhtml.
[code]
<?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!
Responder

27/02/2012

Tiago Silva

Estou só piorando a situação... rs ¬¬
Só para constar, estou usando JSF 2.0 com Netbeans 7.1.
Responder

27/02/2012

Robson Teixeira

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
Responder

27/02/2012

Tiago Silva

Ajudou totalmente Robson!
Muito obrigado meu caro!
Abraço!
Responder

27/02/2012

Tiago Silva

É... 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?
Responder

27/02/2012

Robson Teixeira

tenta colocar um return logo apos o sendRedirect.
Responder

27/02/2012

Tiago Silva

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!
Responder

28/02/2012

Robson Teixeira

bacana tiago parabéns e obrigado por postar sua solução agora favor feche o chamado.
att
robson
Responder

28/02/2012

Tiago Silva

Não tô sabendo como... ¬¬
Responder

28/02/2012

Robson Teixeira

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.
Responder

03/03/2012

Dyego Carmo

Opa !

Funcionou ?

Poderia fechar o chamado ? :D

Valeu !
Responder

03/03/2012

Tiago Silva

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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar