[RESOLVIDO]Aplicação não respeita Filtro de Login

8 respostas
Diego_Adriano

Bão, meu problema é que não estou conseguindo forçar o Login na minha aplicação, se tento subir diretamente pelo "home" ela funciona normalmente.

Filter
@WebFilter(servletNames={"Login Filter"})
public class LoginFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain)throws ServletException,IOException{
		
		HttpServletRequest req = (HttpServletRequest) request;
		HttpSession session = req.getSession();
		
		if (session.getAttribute("autenticado") != null ||
				req.getRequestURI().endsWith("/pages/login/login.xhtml")){
			chain.doFilter(request, response);
			
		}
		else{
			HttpServletResponse res = (HttpServletResponse) response;
			res.sendRedirect("/pages/login/erro.xhtml");
		}
		
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}
Login
public String logar(){
		
		ELContext elContext = FacesContext.getCurrentInstance().getELContext();
		this.entityManager = (EntityManager) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "entityManager");
		
		LoginRepository repository = new LoginRepository(this.entityManager);
		
		try {
			Usuario login = repository.autentica(usuario);
			
			if (login.getUsuario().equals("") || login.getUsuario() == null){
				FacesContext.getCurrentInstance().addMessage("consulta:id", new FacesMessage("Usuário ou senha Errada"));
				usuario = new Usuario();
				
				System.out.println(erro);
                                return "/pages/login/login";

			}else{
				HttpSession sessioon = (HttpSession) FacesContext.getCurrentInstance()
						.getExternalContext().getSession(false);
				sessioon.setAttribute("autenticado", true);
				
				login.setLogado(true);
				login.setUltimoAcesso(new Date());
				System.out.println("erro =0");
				erro =0;
				
				//repository.AtualizaAcesso(login);
				
			return "/pages/home";
				
		}
	} catch (NoResultException e) {
		e.printStackTrace();
		erro++;
		System.out.println("catch");
		return "/pages/login/login";
	}
		
}
Web.xml
<filter>
   <filter-name>LoginFilter</filter-name>
   <filter-class>br.com.boletos.filter.LoginFilter</filter-class>
</filter>
	  
<filter-mapping>
   <filter-name>LoginFilter</filter-name>
   <servlet-name>Login Filter</servlet-name>
</filter-mapping>

<filter>
  <filter-name>ControleFilter</filter-name>
  <filter-class>br.com.boletos.filter.ControleFiltro</filter-class>
</filter>
	  
<filter-mapping>
    <filter-name>ControleFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

8 Respostas

J

Como está mapeado o Servlet chamado “Login Filter”?

Diego_Adriano

Dessa forma:

@WebFilter(servletNames={"Login Filter"}) public class LoginFilter implements Filter {

O problema é que ele não esta barrando a navegação sem autenticação, porém se entro na tela de login ele executa corretamente

E

Cara voce esta usando jsf né ! tenta usar o phaselistener.

http://semprejava.wordpress.com/2010/08/04/25/

Hebert_Coelho

Eu não sei como funciona ainda com anotações, caso você queira ver um exemplo com xml, esse aqui funciona: http://uaihebert.com/?p=19 .

J

Diego Adriano:
Dessa forma:

@WebFilter(servletNames={"Login Filter"}) public class LoginFilter implements Filter {

O problema é que ele não esta barrando a navegação sem autenticação, porém se entro na tela de login ele executa corretamente

Eu sei como o filtro está sendo mapeado. o que perguntei foi como está mapeado o servlet que vc colocou como parâmetro em seu annotation de mapeamento do filtro (@WebFilter(servletNames={“Login Filter”}) ).

lembre-se que tem basicamente 2 forma de configurar um filtro.

a primeira delas é configurar diretamente no filtro as urls que ele irá filtrar.

@WebFilter(filterName = "myFilter", urlPatterns = {"/*"}) public class MyFilter implements Filter {

E a segunda é utilizar um servlet (JÁ MAPEADO PARA DETERMINADAS URLS) para indicar quais urls serão filtradas.

@WebFilter(filterName = "myFilter", servletNames={"Login Filter"}) public class MyFilter implements Filter {

Note que existe diferença entre os Nome do filtros (filterName) e o servlet que fornecerá as url a serem filtradas (servletNames).

O que te perguntei foi como vc mapeou o servlet usado na configuração do filtro. para o seu exemplo funcionar a configuração do referido servlet deveria ser algo do tipo:

@WebServlet(name = “Login Filter”, urlPatterns = {"/*"})
public class MyServlet extends HttpServlet {

Ai sim, seu filtro funcionaria da forma que foi configurado. Contudo caso esse servlet não existe recomendo que vc configure direto o(s) padrão(ões) de url a ser filtrado (urlPatterns) ou use o servlet do JSF (que geralmente é Faces Servlet). Desta ultima forma todas as requisições ao jsf passaram pelo filtro.

Tente configurar ser filtro assim:

@WebFilter(servletNames={"Faces Servlet"})

com isso já deve funcionar, mas pode não ser a melhor solução em termos de desempenho.

Diego_Adriano
Bom Dia, bom galera, consegui forçar o usuário a fazer login, ou seja se ele tentar subir a aplicação pelo "Home" ele será redirecionado para page de login, porém agora estou com um problema, a pag é gerada sem o Layout sem CSS nem o Theme do Prime ele esta pegando, o que pode ser ? Meu filter ficou assim:
if (req.getRequestURI().endsWith("/boletos/pages/login/login.xhtml")){
			System.out.println("LF - "+req.getRequestURI());
			System.out.println("LF - IF 'PAGE LOGIN'");
			chain.doFilter(request, response);
		}
			else if ( !req.getRequestURI().endsWith("/boletos/pages/login/login.xhtml")
					&& user != null){
			
					System.out.println("LF - "+req.getRequestURI());
					System.out.println("LF - IF REDIRECT OK");
					chain.doFilter(request, response);
							
			}
			else{
				System.out.println("LF - IF REDIRECT ERRo");
				System.out.println("LF - URL= "+req.getRequestURL());
				System.out.println("LF - URI= "+req.getRequestURI());
				
				HttpServletResponse res = (HttpServletResponse) response;
				res.sendRedirect("/boletos/pages/login/login.xhtml");
				
		}

[img][/img]Log gerado qdo subo pela page de login:

LF - BEFORE HTTP
LF - /boletos/pages/login/login.xhtml
LF - IF 'PAGE LOGIN'

Log gerado qdo subo pelo Home, note que ele REDIRECIONA para a page de login, porém continuo com o erro da pag ser exibida sem CSS, etc

LF - BEFORE HTTP
LF - IF REDIRECT ERRo
LF - URL= http://localhost:8081/boletos/pages/home.xhtml
LF - URI= /boletos/pages/home.xhtml
LF - BEFORE HTTP
LF - /boletos/pages/login/login.xhtml
LF - IF 'PAGE LOGIN'
Estou enviando um print junto
Diego_Adriano

JNJunior, só pra complementar realmente o erro era o Mapeamento do Filtro no Web.xml

Diego_Adriano

Bão galera, resolvi o problema seguindo a sugestão de vcs, deixei de usar Filter e passei a usar o PhaseListener …
mais uma vez … obrigado

Criado 28 de maio de 2012
Ultima resposta 31 de mai. de 2012
Respostas 8
Participantes 4