Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Filter não está sendo chamado

Olá amigos, estou com um probleminha aparentemente bem bobo, estou tentando aplicar o Filter na minha aplicação como o professor ensinou, fazendo ele ser chamado antes do Servlet/Controlador.

Porém mesmo os dois contendo o mesmo caminho (urlPatterns="/") o Filter não é chamado em momento algum. Já revisei o código algumas vezes e tudo parece no lugar, da mesma forma como o professor mostrou.

Alguém consegue me ajudar com isso? Faltou eu configurar o que para o Filter ser chamado?

Classe do Filter abaixo:

package com.doglab.filters;

import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;

@WebFilter(urlPatterns="/")
public class EntranceFilter implements Filter{

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        long curMilis = System.currentTimeMillis();
        System.out.println("oduiashdoias");
        chain.doFilter(req, res);
        long newCurMilis = System.currentTimeMillis();
        System.out.println("Tempo de execução: " + (newCurMilis - curMilis));
    }

}

Classe do Servlet/Controlador abaixo:

package com.doglab.controllers;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import com.doglab.actions.Action;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns="/")
public class EntradaServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) 
            throws ServletException, IOException {

        String actionURI = req.getRequestURI().split("/")[2];
        String respAction = null;
        try {
            Class<?> actionsClass = Class.forName("com.doglab.actions."+actionURI+"Action");
            Action curAction = (Action) actionsClass.getDeclaredConstructor().newInstance();
            respAction = curAction.exec(req, res);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException 
                | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
                | SecurityException e) {
            throw new ServletException(e);
        }

        String[] methodURI = respAction.split(":");
        if(methodURI[0].equals("foward")) {
            RequestDispatcher rd = req.getRequestDispatcher("WEB-INF/view/" + methodURI[1]);
            rd.forward(req, res);
        }else {
            res.sendRedirect(methodURI[1]);
        }

    }

}
2 respostas

muda algo se arrumar o typo ali pra:

if(methodURI[0].equals("forward"))

?

solução!

Pode ficar tranquilo, acabei conseguindo resolver pesquisando bastante. Mas obg por tentar ajudar <3

A solução era justamente que o Mapping do filter não pode ser apenas (urlPatterns="/"), isso configuraria o filtro apenas para a url:

http://localhost:8080/Alura-Servlet/

Ao invés disso, o mapping deveria ser (urlPatterns="/*"), isso deixaria claro que todo e qualquer url chamaria primeiro o nosso filter.