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?
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¶m2=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 sucesso!