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

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

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

}

}[/code]

Login

[code]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";
}

}[/code]
Web.xml

[code]
LoginFilter
br.com.boletos.filter.LoginFilter

LoginFilter Login Filter ControleFilter br.com.boletos.filter.ControleFiltro ControleFilter Faces Servlet [/code]

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

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

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

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

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 .

[quote=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[/quote]

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.

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:

[code]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");
			
	}[/code]

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


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

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