Fórum Filtro não funciona direito #527130

28/07/2015

0

Tenho o seguinte filtro
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

Carlos Rocha

Responder

Posts

29/07/2015

Kennedy Oliveira

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


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
Responder

Gostei + 0

29/07/2015

Carlos Rocha

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?
Responder

Gostei + 0

29/07/2015

Carlos Rocha

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;
	}	
}
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar