6
respostas

Depurar a classe FiltroDeAuditoria

Olá. Estou tentando depurar a classe FiltroDeAuditoria e nao tenho conseguido. Inseri um breakpoint em uma linha da referida classe, fiz a execução pelo Debug, tendo iniciado pelo navegador e pelo próprio Eclipse. No Gerenciador faço o login mas no caio e paro no FiltroDeAuditoria. Podem me ajudar? Obrigado.

6 respostas

Boa tarde, Eduardo! Como vai?

Duas possibilidades que me vieram a mente é vc estar acessando uma servlet que não é filtrada pelo seu filter ou então vc ter colocado o breakpoint numa parte do filtro que nunca é executada. Mas isso tudo é só cogitação! Então vc poderia colocar o código completo do seu filtro aqui, indicando onde foi que vc colocou o breakpoint e qual a url que vc está tentando acessar e não está sendo filtrada?

Bom dia Gabriel. Vamos lá. O breakpoint foi colocado nas 2 linhas : Cookie cookie = new Cookies(req.getCookies()).getUsuarioLogado(); String usuario = "";


package br.com.alura.gerenciador.web;

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.annotation.WebFilter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest;

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

@Override
public void destroy() {
    // TODO Auto-generated method stub

}

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

    //Cookie cookie = this.getUsuario(req);
    Cookie cookie = new Cookies(req.getCookies()).getUsuarioLogado();
    String usuario = "<deslogado>";

    if (cookie != null) {
        usuario = cookie.getValue();
    }

    System.out.println("Usuário " + usuario + " acessando a URI " + req.getRequestURI());
    chain.doFilter(request, response);
}

private Cookie getUsuario(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    if (cookies == null) {
        return null;
    }

    for (Cookie cookie: cookies) {
        if (cookie.getName().equals("usuario.logado")) {
            return cookie;
        }
    }

    return null;
}

@Override
public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub

}

}


Estou tentando acessar a url : localhost:8080/gerenciador/login

segue a classe:

@WebServlet(urlPatterns="/login") public class Login extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    PrintWriter writer = resp.getWriter();

    String email = req.getParameter("email");
    String senha = req.getParameter("senha");

    Usuario usuario = new UsuarioDAO().buscaPorEmailESenha(email, senha);

    if (usuario == null) {
        writer.println("<html><body>Usuário ou senha inválida!!!</body></html>");
    }
    else {
        Cookie cookie = new Cookie("usuario.logado", email);
        resp.addCookie(cookie);
        writer.println("<html><body>Usuário logado: " + email + "</body></html>");
    }


}

}

Boa tarde, Eduardo! Como vai?

O primeiro ponto que vc precisa observar é que o código do seu filtro não está compilando. A linha a seguir está incorreta:

Cookie cookie = new Cookies(req.getCookies()).getUsuarioLogado();

Na realidade, olhando o seu código, o que vc precisa fazer é utilizar o método getUsuario() criado dentro do filtro dessa forma:

Cookie cookie = getUsuario(req);

Feita essa modificação eu imagino que as coisas irão funcionar da forma como vc queria!

Faça um teste aí e verifique isso! Se ainda assim o problema persistir é só falar aqui que eu continuo te ajudando!

Grande abraço e bons estudos!

Gabriel, foi copiei uma classe ja atualizada pelos exercicios subsequentes. Ela esta compilando sim. Considere a classe abaixo: FiltroDeAuditoria @WebFilter (urlPatterns="/*") public class FiltroDeAuditoria implements Filter {

@Override
public void destroy() {
    // TODO Auto-generated method stub

}

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

//    Cookie cookie = this.getUsuario(req);
    Cookie cookie = new Cookies(req.getCookies()).getUsuarioLogado();

// HttpSession session = req.getSession(); // Usuario usuarioLogado = (Usuario) session.getAttribute("usuario.logado");

    String usuario = "<deslogado>";

    if (cookie != null) {
        usuario = cookie.getValue();
    }

// if (usuarioLogado != null) { // usuario = usuarioLogado.getEmail(); // }

    System.out.println("Usuário " + usuario + " acessando a URI " + req.getRequestURI());
    chain.doFilter(request, response);
}

private Cookie getUsuario(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    if (cookies == null) {
        return null;
    }

    for (Cookie cookie: cookies) {
        if (cookie.getName().equals("usuario.logado")) {
            return cookie;
        }
    }

    return null;
}

@Override
public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub

}

}

Com relacao ao metodo getUsuarioLogado este faz parte da classe Cookies

package br.com.alura.gerenciador.web;

import javax.servlet.http.Cookie;

public class Cookies { private final Cookie[] cookies;

public Cookies(Cookie[] cookies){
    this.cookies = cookies;
}

public Cookie getUsuarioLogado() {

    if (this.cookies == null) { 
        return null;
    }

    for (Cookie cookie : cookies) {
        if (cookie.getName().equals("usuario.logado")) {
            return cookie;
        }
    }
    return null;
}

}

Tudo estava funcionando normalmente, mas nao consigo depurar.

Eduardo, eu usei o código de suas classes fazendo apenas uma modificação (troquei o doPost() para doGet() na servlet para que pudesse atender uma requisição do navegador sem a necessidade de um formulário). Coloquei o breakpoint na linha que vc indicou, iniciei p Tomcat em modo de debug e tudo funcionou perfeitamente. Dá uma olhada nesse print que eu tirei mostrando o Eclipse parado no breakpoint marcado (linha destaca em verde no código da classe FiltroDeAuditoria).

Pode ser que o seu projeto tenha algum problema ou pode ser tbm que vc esteja fazendo algum passo errado. Em todo caso, vc poderia compartilhar o seu projeto cmg? Exporte o projeto pelo Eclipse gerando um zip dessa forma, coloque no dropbox ou no google drive e mande o link aqui. Daí eu farei o download e darei uma olhada de perto no que está acontecendo!

Bom dia Gabriel. Segue o link do projeto: https://drive.google.com/file/d/1QRbIBoAuasaMdrqNrR78LRg0bJN39lF_/view?usp=sharing

Como dei continuidade ao curso,mesmo após esta dúvida, algumas linhas estão comentadas. Basta então descomentá-las e comentar aquelas que até então as substitui. Mesmo tendo feito esta modificação que você expôs logo acima, ainda assim a dúvida perdura. Por que não funciona com o método Post? Abraços e fico no aguardo.