Controlar sessão com filter [JSF 2.0]

6 respostas
A

Pessoal, eu sei como criar uma sessão e fazer tudo funcionar perfeitamente, porém não sei como manter páginas abertas mesmo sem estar logado.
Com esta classe eu consigo deixar a verificação funcionando normalmente:

public class LoginFilter implements Serializable, Filter {

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

        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        String chave = (String)session.getAttribute("autenticado_chave");

        if (chave != null) {
            chain.doFilter(request, response);
        } else {
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect("/Pagina/index.jsp");
        }

    }

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

    @Override
    public void destroy() {
    }

}

mas eu tenho alguma páginas que pode ser acessadas externamente sem a necessidade de estar logado, porém com este código ele joga todos para a página de autenticação antes.
como que eu abro essas exceções???

6 Respostas

J

Você pode condicionar a página chamada conforme esse exemplo:

String uri = req.getRequestURI();
int index = uri.lastIndexOf("/");
String path = uri.substring(index);

if (path.equals("/consulta.xhtml")) {
   ...
}
I

Que tal você criar um array das páginas que não serão filtradas e dentro do doFilter(…) você põe um if para ver se é uma delas… não é o melhor jeito de se fazer, mas, funciona…

R

Você pode colocar suas páginas privadas em um diretório tipo: privado. Daí é só especificar o caminho do filtro para /private/* (tudo o que estiver no diretório privado). Atenção não coloque a pasta de login dentro deste diretório.

C

Mais facil ainda…
Todas as páginas que requerem login ficarão dentro de um diretório /seguro/*.jsp
As demais na raiz…
E no web.xml o mapeamento do filter fica assim:

<filter>
		<filter-name>SeuFilter</filter-name>
		<filter-class>
			br.com.exemplo.filter.SeguroCneFilter
		</filter-class>
	</filter>

 	<filter-mapping>
		<filter-name>SeuFilter</filter-name>
		<url-pattern>/seguro/*</url-pattern>
	</filter-mapping>

Entendeu??

Abs,

F

Olá! Bom dia,

Onde e como exatamente eu uso esse filtro ai? Estou implementando um login e não sei como usar o filtro.

Obrigado!

F

Consegui! Fiz desta maneira:

  1. Programei um filtro:
public class LoginFilter implements Serializable, Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response; 
        UserManager userManager = (UserManager) req.getSession().getAttribute("userManager");
  
        if (userManager == null || !userManager.isLoggedIn()) {
        	// Aqui retorno se não existir...
        	res.sendRedirect(req.getContextPath() + "/index.xhtml");
        } else {
        	// Aqui continua se existir
        	chain.doFilter(request, response); 
        }


}
  1. Configurei no web.xml
<!-- FILTER -->
	<filter>
		<filter-name>Login Filter</filter-name>
		<filter-class>br.com.meupacote.nomeproj.pack.LoginFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>Login Filter</filter-name>
		<url-pattern>/secured/*</url-pattern>
	</filter-mapping>
	<!-- FILTER -->

Este filtro irá filtrar todas as páginas no diretório “secured”!

Me surgiu uma dúvida? Como montar uma url amigável? para não aparecer no navegador: http:www.site.com.br/secured/pag.html
Bom o meu filtro parece que funcionou, mas, se alguém tiver alguma melhoria ou sugestão eu agradeço!

Att,
Filipe.

Criado 24 de abril de 2011
Ultima resposta 17 de jan. de 2012
Respostas 6
Participantes 6