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.