Iniciante, tentando Login com Jsf e Servelet Filter.
27/02/2012
0
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
Posts
27/02/2012
Tiago Silva
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?
27/02/2012
Tiago Silva
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!
27/02/2012
Tiago Silva
Só para constar, estou usando JSF 2.0 com Netbeans 7.1.
27/02/2012
Robson Teixeira
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
27/02/2012
Tiago Silva
Muito obrigado meu caro!
Abraço!
27/02/2012
Tiago Silva
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?
27/02/2012
Tiago Silva
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!
28/02/2012
Robson Teixeira
att
robson
28/02/2012
Robson Teixeira
03/03/2012
Tiago Silva
E desculpe não ter fechado ainda, mas não estou conseguindo encontrar opção para fechar!
Clique aqui para fazer login e interagir na Comunidade :)