Duvida sobre filtro JSP

estou tentando aplicar um Filter usando JSP e estou sentindo muita dificuldade, estava fazendo dessa forma só que não uma boa prática Segue meu codigo.

Minha Servlet Controladora

@WebServlet("/mvc")
public class ServletController extends HttpServlet{

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	String parametro = request.getParameter("logica");
	String nomeDaClasse = "br.com.triadworks.todoList.logica." + parametro;

	try {
		Class classe = Class.forName(nomeDaClasse);
		Logica logica = (Logica) classe.newInstance();
		String pagina = logica.executa(request, response);
		request.getRequestDispatcher(pagina).forward(request, response);
	} catch (Exception e) {
		throw new ServletException("A lógica causou uma exceção!", e);
	}
}

}

Minha Logica

public class AdicionaTarefa implements Logica {

@Override
public String executa(HttpServletRequest request, HttpServletResponse response) throws Exception {

	if (request.getSession().getAttribute("usuarioLogado") != null) {
		request.setAttribute("situacoes", Arrays.asList(Situacao.values()));
		return "WEB-INF/jsp/view/adiciona.jsp";
	}
	return "mvc?logica=TelaLogin";
}

}

OBS: Caso eu tenho várias logicas estou fazendo uma verificação, como quero aplicar o filter, como eu faço, eu fiz até aqui.

@WebFilter("/*")
public class AutenticacaoFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
		throws IOException, ServletException {
	System.out.println("antes...");
	HttpServletRequest httpServletRequest = (HttpServletRequest) request;
	 HttpServletResponse servletResponse = (HttpServletResponse) response;
	 HttpSession session = httpServletRequest.getSession();

	 if(session.getAttribute("usuarioLogado") != null){
	 }
	 servletResponse.sendRedirect("login.jsp");
}

}

O objeto FilterChain possui um método doFilter e quando chamado prossegue a requisição…

// tudo o que preciso fazer antes da requisição concluir
chain.doFilter(request, response);
// tudo o que preciso fazer depois da requisição concluir

Tendo isso em mente, você pode deixar o fluxo seguir se o if for true…

...
if(session.getAttribute("usuarioLogado") != null){
    chain.doFilter(request, response);
}
...

Chamando o doFilter do chain, você garante a “chamada” das páginas, só assim para prosseguir…

Estou tentando fazer um filter, mais quando tento logar ele só atualiza a pagina, segue meu codigo.

@WebFilter("/mvc")
public class AutenticacaoFilter implements Filter {

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

	HttpServletRequest req = (HttpServletRequest) request;

	Usuario usuario = (Usuario) req.getSession().getAttribute("usuarioLogado");

	System.out.println("URI: " + req.getRequestURI());

	if (usuario != null) {
		chain.doFilter(request, response);
	} else {
		request.getRequestDispatcher("login.jsp").forward(request, response);
	}
}

}

Na verdade seu if falta uma verificação…

String caminho = ((HttpServletRequest) request).getRequestURI(); 

if (usuario != null || caminho.startsWith("/login")) {
   ...
} else {
   ...
}

Do jeito que esta ele nunca vai deixar concluir o login e sempre volta pro login pegou? :joy:

O filtro precisa deixar passar quando o usuario logar e depois só logado…

Obrigado pela ajuda amigo, estou fazendo assim e nada ainda, fica do mesmo jeito. Ou seja, ao tentar logar ele fica voltando para login, não sei o que devo está errando.

@WebFilter("/mvc")
public class AutenticacaoFilter implements Filter {

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

		System.out.println("Inicia Interceptação...");
		
		HttpServletRequest req = (HttpServletRequest) request;
		
		String caminho = req.getRequestURI();
		
		Usuario usuario = (Usuario) req.getSession().getAttribute("usuarioLogado");

		if (usuario != null || caminho.startsWith("login.jsp")) {
			chain.doFilter(request, response);
		} else {
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}
	}
}

Perceba que coloquei startsWith /login e não login.jsp… há diferenças…

Nesse caso tente dessa outra forma…

if (usuario != null || caminho.endsWith("login.jsp")) {...

Com startsWith seria algo como se o usuário digitasse na barra do navegador algo assim:

www.site.com.br/login

Usando endsWith, podemos ter uma URL assim:

www.site.com.br/login.jsp

Ou ainda…

www.site.com.br/usuario/login.jsp

Ou…

www.site.com.br/adm/perfil/login.jsp

Percebeu a diferença na utilização de cada um?

Conheça mais a API que está trabalhando, são métodos básicos da classe String, pesquise também sobre o contains, pode ajudar, boa sorte

obrigado pela Ajuda, estou fazendo assim, no caso ele pego a minha URI que seria: /todoList/mvc, só que está ficando do mesmo jeito rsrs

@WebFilter("/mvc")
public class AutenticacaoFilter implements Filter {

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

		System.out.println("Inicia Interceptação...");
		
		
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		
		Usuario usuario = (Usuario) req.getSession().getAttribute("usuarioLogado");
		
		String url = req.getRequestURI();
		System.out.println(url);
		
		if (usuario != null || url.endsWith("?logica=AdicionaTarefa")) {
			
			chain.doFilter(request, response);
			return;
		}
			resp.sendRedirect("login.jsp");
	}
}

Mais uma vez você precisa ler o que os métodos retornam… mais uma aula pra vc…

Uma url completa possui 4 partes: procotolo (protocol), dominio (domain/site), caminho/documento (path/document) e parãmetros (params ou querystring)…

  • protocolo: http://, https://, ftp://, ws:// etc…
  • dominio: www.site.com.br, site.com.br, etc…
  • path: /admin, /admin/login, /projeto/pasta1/pasta2 etc…
  • queryString: ?param1=valor1&param2=valor2, etc…

Quando se usa o getRequestURI ele retorna os três primeiros deixando o queryString de fora, justo o que você está usando para comparar ai sempre retorna false e nunca entrará no if… para resolver isso vocẽ pode tentar usar o método queryString

String params = req.getQueryString();

if (usuario != null || params.equals("?logica=LoginUsuario")) {
   ...
}

E assim por diante, tenha em mente que o que te passo aqui não é a regra, são maneiras de tentar resolver o problema, cabe a você dar uma pesquisada na classe e adaptar a sua necessidade, não se conforme com tudo o que te passam de primeira, seja curioso e vá além, tente outras formas. programação é isso no começo… tentativa e erro

Vai debugando no console o que as strings retornam quando você chama cada requisição é a melhor forma de ajustar seu if, até porque cada vez que te mostro uma coisa você muda a url ai fica dificil pra mim te ajudar :joy: sucesso!