Problema com Filter

Esse filter fica redirecionando sem parar para a página login.html e não sei porque. Alguem pode ajudar?

O web.xml está assim:

  <filter>
  <filter-name>Filtro Seguranca</filter-name>
  <filter-class>servlet.loginFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>Filtro Seguranca</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

E o filter

package servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class loginFilter implements Filter {

	public void init(FilterConfig config) throws ServletException {
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpSession session = ((HttpServletRequest) req).getSession();
		String usuario = (String) session.getAttribute("usuario");
		if (usuario == null) {
			((HttpServletResponse) res).sendRedirect("login.html");
		} else {
			chain.doFilter(req, res);
		}
	}

	public void destroy() {
	}
}

Obrigado.

Simples, porque seu Filter tem que verificar se URL requisitada não é justamente o “login.html”. Afinal não precisa estar autenticado para entrar nele, não concorda?

Verdade, consegui fazer e funcionou.

Porém agora pensei, e as páginas de erro? As páginas CSS, etc…

Também vou colocar no código para não considerar? Creio que deve ter uma maneira melhor certo?

Segue o código alterado abaixo…

package servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class loginFilter implements Filter {

	public void init(FilterConfig config) throws ServletException {
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		
		HttpSession session = ((HttpServletRequest) req).getSession();
		String usuario = (String) session.getAttribute("usuarioLogado");
		
		String paginaAtual = ((HttpServletRequest) req).getServletPath();
		
		if ((usuario == null) && ((paginaAtual.indexOf("login.html") < 0)) 
				&& ((paginaAtual.indexOf("checaUsuario.jsp") < 0))){
			((HttpServletResponse) res).sendRedirect("login.html");
		} else {
			chain.doFilter(req, res);
		}
	}

	public void destroy() {
	}
}

Olha,

certo certo mesmo seria usar tecnologias como Spring ou um framework WEB que possua facilidade de implementar responsabilidades transversais, como o Struts2 e o VRaptor, por exemplo.

Mas, se for o caso de realmente usar Filter, há opções “elegantes” como, por exemplo, fazer com que toda requisição que termina com “.js”, “.css”, “.jpeg” e demais relacionadas a conteúdos estáticos também seja ignorada pela segurança. Ou você deixa isso direto no código fonte ou como parâmetro de aplicação no web.xml

VRaptor é um plugin de eclipse? E esse Struts2 também?

Onde eu posso achar mais detalhes?

Obrigado.