Filtro não funciona direito
Tenho o seguinte filtro
E a seguinte Servlet:
No filtro, adicionei à lista de exceções:
Mas o filtro só permite a execução na pasta retornos apenas quando o login é realizado com sucesso e a condição de status é igual a 'd'!
Porque isso esta acontecendo?
package filtro;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter("/admin/*")
public class AdminFilter implements Filter
{
private static List<String> allowedURIs;
public AdminFilter()
{
// TODO Auto-generated constructor stub
}
public void destroy()
{
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession sessao= req.getSession();
if(sessao.getAttribute("admin")!= null || allowedURIs.contains(req.getRequestURI()))
{
chain.doFilter( request, response );
}
else
{
res.sendRedirect("index.jsp");
}
}
public void init(FilterConfig fConfig) throws ServletException
{
if(allowedURIs == null)
{
allowedURIs = new ArrayList<String>();
allowedURIs.add(fConfig.getInitParameter("loginActionURI"));
allowedURIs.add("/imwsaogotardo/admin/index.jsp");
allowedURIs.add("/imwsaogotardo/admin/retornos/*");
}
}
}
E a seguinte Servlet:
...
AutenticaAdmin autenticaAdmin = new AutenticaAdmin();
Admin admin = autenticaAdmin.pesquisaAutenticaAdmin (login, senha);
if(admin!=null)
{
HttpSession sessao = request.getSession();
if(admin.getStatus().equals("d"))
{
sessao.setAttribute("admin", admin);
//só redireciona aqui, as demais param na Servlet
response.sendRedirect("admin/retornos/admin/loginOK.jsp");
}
else
{
sessao.setAttribute("nomeAdmin", admin.getNome());
response.sendRedirect("admin/retornos/admin/loginBloqueado.jsp");
}
}
else
{
response.sendRedirect("admin/retornos/admin/loginERRO.jsp");
}
...
No filtro, adicionei à lista de exceções:
allowedURIs = new ArrayList<String>();
allowedURIs.add(fConfig.getInitParameter("loginActionURI"));
allowedURIs.add("/imwsaogotardo/admin/index.jsp");
allowedURIs.add("/imwsaogotardo/admin/retornos/*");
Mas o filtro só permite a execução na pasta retornos apenas quando o login é realizado com sucesso e a condição de status é igual a 'd'!
Porque isso esta acontecendo?
Carlos Rocha
Curtidas 0
Respostas
Kennedy Oliveira
28/07/2015
Olá Carlos,
isso está acontecendo por que em allowedUris você está colocando uma string "/imwsaogotardo/admin/retornos/*" dentro de um array list, e no método do filtro você está utilizando o contains do arraylist, esse método não resolve o caracter "*" da string, você tem que fazer isso manualmente, uma forma simples de fazer seria algo do tipo
No lugar da uri "/imwsaogotardo/admin/retornos/*", adicionar na lista o seguinte "imwsaogotardo/admin/retornos"
e na classe filter criar um método similar ao abaixo:
Código java 7
Código java 8:
Substituir sua validação pela chamada do método que você criou.
Pronto, deve funcionar da forma que você precisa!
Espero ter ajudado!
Abraços,
Kennedy Oliveira
isso está acontecendo por que em allowedUris você está colocando uma string "/imwsaogotardo/admin/retornos/*" dentro de um array list, e no método do filtro você está utilizando o contains do arraylist, esse método não resolve o caracter "*" da string, você tem que fazer isso manualmente, uma forma simples de fazer seria algo do tipo
No lugar da uri "/imwsaogotardo/admin/retornos/*", adicionar na lista o seguinte "imwsaogotardo/admin/retornos"
e na classe filter criar um método similar ao abaixo:
Código java 7
public boolean precisaDireitoAcessoURI(String uriAtual) {
for (String uri: allowedURIs) {
if (uri.contains(uriAtual)
return false;
}
return true;
}
Código java 8:
public boolean precisaDireitoAcessoURI(String uriAtual) {
return allowedURIs.stream().noneMatch(uri -> uri.contains(uriAtual));
}
Substituir sua validação pela chamada do método que você criou.
if(sessao.getAttribute("admin")!= null || !precisaDireitoAcessoURI(req.getRequestURI()))
Pronto, deve funcionar da forma que você precisa!
Espero ter ajudado!
Abraços,
Kennedy Oliveira
GOSTEI 0
Carlos Rocha
28/07/2015
Pois é. Esse é realmente o problema!
No final das contas eu penso que o ideal seria fazer o inverso.
Pegar
req.getRequestURI().contains();
E passar o ArraList$ paa saber se existe no req.getRequestURI() alguma parte que se pareça com alguma cobinação do ArrayList. Mas essa lógica esta me deixando perdido!
Liberar o filtro de um diretório ( e seus subdiretórios) inteiro!
Tentei com os loops que passou mas deu erro 500 nos 2 métodos!
O que pode ser?
Só por curiosidade: esse loop for each que você implementos não faz a mesma coisa do que eu havia feito não?
No final das contas eu penso que o ideal seria fazer o inverso.
Pegar
req.getRequestURI().contains();
E passar o ArraList$ paa saber se existe no req.getRequestURI() alguma parte que se pareça com alguma cobinação do ArrayList. Mas essa lógica esta me deixando perdido!
Liberar o filtro de um diretório ( e seus subdiretórios) inteiro!
Tentei com os loops que passou mas deu erro 500 nos 2 métodos!
O que pode ser?
Só por curiosidade: esse loop for each que você implementos não faz a mesma coisa do que eu havia feito não?
GOSTEI 0
Carlos Rocha
28/07/2015
Acho que consegui. Mas quero tua opinião:
package filtro;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter("/admin/*")
public class AdminFilter implements Filter
{
private static List<String> allowedURIs;
public AdminFilter()
{
// TODO Auto-generated constructor stub
}
public void destroy()
{
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession sessao= req.getSession();
if(
sessao.getAttribute("admin")!= null ||
precisaDireitoAcessoURI(req.getRequestURI()) ||
req.getRequestURI().equals("/imwsaogotardo/admin/") ||
req.getRequestURI().equals("/imwsaogotardo/admin")
)
{
chain.doFilter( request, response );
}
else
{
res.sendRedirect("index.jsp");
}
}
public void init(FilterConfig fConfig) throws ServletException
{
if(allowedURIs == null)
{
allowedURIs = new ArrayList<String>();
allowedURIs.add("/imwsaogotardo/admin/index.jsp");
allowedURIs.add("/imwsaogotardo/admin/retornos/");
}
}
public boolean precisaDireitoAcessoURI(String uriAtual)
{
for (String uri: allowedURIs)
{
if (uriAtual.contains(uri))
return true;
}
return false;
}
}
GOSTEI 0