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

Sugestão de implementação

Em um código de testes, para reforçar o aprendizado sobre adotar o padrão de uma única servlet para toda a aplicação, me deparei com um problema: Gostaria que algumas paginas fossem protegidas e outras não.

Gostaria que, por exemplo, fazTudo?tarefa=BuscaEmpresa pudesse ser acessada por usuarios não logados e , por exemplo, fazTudo?tarefa=NovaEmpresa pudesse ser acessada somente por usuários logados.

Fiquei em dúvida em como implementar o filtro, já que não poderia colocar o @WebFilter como "/fazTudo" ou estaria pegando todas as páginas.

Então fiz da seguinte forma:

1) Criei uma classe abstrata chamada FazTudo, que estende HttpServlet, com um método chamado execute que recebe a request, o response e uma String que define o pacote que irá compor o nome completo da classe, assim:

public abstract class FazTudo extends HttpServlet {

    protected void execute(HttpServletRequest req, HttpServletResponse res, String pckg) throws Exception {
        String task = req.getParameter("tarefa");

        if(task == null || task == ""){
            throw new IllegalArgumentException("Nenhuma tarefa foi passada para o Controller");
        }            

        String className = pckg + "." + task;

        Class clazz = Class.forName(className);
        Tarefa object = (Tarefa) clazz.newInstance();
        String page = object.execute(req, res);

        req.getRequestDispatcher("/WEB-INF/pages/" + page).forward(req, res);
    }

}

2) Criei uma classe FazTudoGeral, que estende FazTudo, e é acessada através de "/fazTudoGeral" e no método service passa a request, a response e o pacote onde ficam as tarefas que podem ser acessadas sem a necessidade de login. Assim:

@WebServlet("/fazTudoGeral")
public class FazTudoGeral extends FazTudo {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        try {
            execute(req, res, "br.com.alura.gerenciador.web.tarefas.geral");
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

}

3) Criei uma classe FazTudoSeguro, que estende FazTudo, e é acessada através de "/fazTudoSeguro" e no método service passa a request, a response e o pacote onde ficam as tarefas que só podem ser acessadas com login efetuado. Assim:

@WebServlet("/fazTudoSeguro")
public class FazTudoSeguro extends FazTudo {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        try {
            execute(req, res, "br.com.alura.gerenciador.web.tarefas.seguro");
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

}

4) E no filtro, seleciono apenas as páginas que são "/fazTudoSeguro". Assim

@WebFilter("/fazTudoSeguro")
public class LoginFilter implements Filter {

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

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        <<PEGA O USUARIO E SE FOR NULL, REDIRECIONA. CASO CONTRARIO, CONTINUA>>

        chain.doFilter(req, res);

    }

}

Gostaria de saber, se esta solução é uma solução boa ou se existe (com essas tecnologias que tenho até agora: Servlets e filtros) alguma solução melhor ou mais eficiente/inteligente.

3 respostas

Fala aí, Fernando! Tudo certinho, cara? =)

Eu não sei se existe uma outra solução utilizando as tecnologias que você mencionou até o momento... Entretanto, quando você avançar um pouco mais em seus estudos, você pode chegar a ver uma framework chamado de Spring. Ele tem um módulo, o Spring Security, que tornará essa parte de segurança muito mais fácil do que fazer na mão, da forma como você está fazendo, sacou? Rs...

Espero ter ajudado, mas qualquer dúvida não hesite em perguntar aqui, no fórum, para que possamos ajudá-lo, beleza? =D

Abraço e bons estudos,

Fábio

Oi Fabio .. Blz.... Tudo certo sim....

Estou seguindo os estudos das carreiras .... Acredito sim que os frameworks vão facilitar muito kkkkk

A minha duvida é mais voltada para a solução que dei.... Se, na medida do possível e com as limitações ate agora, foi uma solução razoável ....

solução!

Fernando,

Acredito que tenha sido uma solução razoável, sim... =)

Abraços,

Fábio