Fórum Filtro não funciona direito #527130
28/07/2015
0
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
Curtir tópico
+ 0Posts
29/07/2015
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
29/07/2015
Carlos Rocha
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
29/07/2015
Carlos Rocha
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
Clique aqui para fazer login e interagir na Comunidade :)