Problemas com web.xml - Usando Filter

10 respostas
J

Pessoal,

Estou começando a utilizar Filter na minha aplicação, pra ver se o usuario esta logado ou nao, etc. Peguei alguns exemplos na internet, dei uma pesquisada e fiz uma classe Filtro, implementando Filter e editei meu web.xml, o problema é que após editar meu web.xml, colocando o mapeamento do filtro simplesmente, a aplicação nao roda. O certo era aparecer no browser http://localhost:8084/Catalogo, só que se eu mexer no web.xml aparece http://localhost:8084/index.jsp e se eu tentar colocar Catalogo/, antes do index volta pra pagina de erro, alguem sabe por quê?

A unica coisa que alterei no meu web.xml foi isso:


FiltroSeguranca
catalogo.controle.seguranca.FiltroSeguranca


FiltroSeguranca
/*

Meu Filtro esta assim:
package catalogo.controle.seguranca;

import catalogo.modelo.Usuario;
import java.io.IOException;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class FiltroSeguranca implements Filter {

    public void init(FilterConfig config) throws ServletException {
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpSession session = ((HttpServletRequest)req).getSession();
        Usuario usuario = (Usuario) session.getAttribute("usuario");

        if(usuario == null)
        {
            session.setAttribute("msg","Você não está logado no sistema!");
            ((HttpServletResponse)res).sendRedirect("${pageContext.request.contextPath}/index.jsp");
        }
        else
        {
            chain.doFilter(req, res);
        }
    }

    public void destroy() {
    }
}

10 Respostas

J

alguem?

UMC

Você já tentou voltar como estava!?
talvez quando você alterou retirou alguma coisa relacionada ao caminho!

tentou assim!

vlw
abs

M

vc já tentou colocar o filtro para alguma página específica ao invés de /* ? Pq assim você está declarando que o filtro tem que funcionar para todas as páginas, mas isso é um pouco incoerente, o usuário precisa ter acesso pelo menos à uma página de login.

Outra coisa que pode estar errado o seu sendRedirect, mas tenta uma coisa de cada vez

pdioniziofilho

seu filtro está “filtrando” (ohhhh) a sua requisição, como o usuário não está logado ele esta direcionando para ${pageContext.request.contextPath}/index.jsp .

Tenta substituir esse caminho por Catalogo/index.jsp

J
Mudei o meu web.xml para não utilizar o filtro em todos os arquivos, apenas em um diretório para testar, ficou assim:
<filter>
        <filter-name>FiltroSeguranca</filter-name>
        <filter-class>catalogo.controle.seguranca.FiltroSeguranca</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FiltroSeguranca</filter-name>
        <url-pattern>/cadastros/*</url-pattern>
    </filter-mapping>
O meu filtro ficou assim:
package catalogo.controle.seguranca;

import catalogo.modelo.Usuario;
import java.io.IOException;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class FiltroSeguranca implements Filter {

    public void init(FilterConfig config) throws ServletException {
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpSession session = ((HttpServletRequest)req).getSession();
        Usuario usuario = (Usuario) session.getAttribute("usuario");

        if(usuario == null)
        {
            session.setAttribute("msg","Você não está logado no sistema!");
            ((HttpServletResponse)res).sendRedirect("Catalogo/index.jsp");
        }
        else
        {
            chain.doFilter(req, res);
        }
    }

    public void destroy() {
    }
}

Com essa alteração eu consigo rodar minha aplicação sem problemas e acesso a pagina de login, o problema agora é que seu eu acessar alguma pagina sem estar logado não aparece a mensagem que defini no meu doFilter, aparece que o IE nao pode exibir a página, porque sera?

J

Pessoal,

Alterei o meu Filter, seguindo um tutorial, mas o web.xml não alterei e agora voltou a não rodar minha aplicação, diz que não conseguiu implementar o modulo.
Nao entendi.

pdioniziofilho

posta suas alterações e o codigo do index

J
Meu novo Filter ficou assim:
package catalogo.controle.seguranca;

import catalogo.modelo.Usuario;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FiltroSeguranca implements Filter {

    public void init(FilterConfig config) throws ServletException {
        try 
        {
            String accessFile = this.getClass().getClassLoader()
                                    .getResource("access.properties")
                                    .getPath();

          Properties properties = new Properties();

          properties.load(new FileInputStream(accessFile));

          HashMap resources = null;
          resources.putAll(properties);
       } 
       catch (Exception e)
       {
          e.printStackTrace();
          throw new ServletException(e);
       }
    }

    public void doFilter(ServletRequest req,
                         ServletResponse res,
                         FilterChain chain) throws IOException, ServletException
    {
       /* HttpSession sessao = ( (HttpServletRequest) req ).getSession();
        Usuario usuario = (Usuario) sessao.getAttribute("usuario");

        if( usuario == null )
        {
            sessao.setAttribute("msg", "Você não está logado no sistema!");
            ( (HttpServletResponse) res ).sendRedirect("index.jsp");
        }
        else
        {
            chain.doFilter(req, res);
        }*/
        boolean allowed = verifyAccess((HttpServletRequest) req);
        if (!allowed) {
            String logon = "logon.jsp?next="
                    + getNextURL((HttpServletRequest) req);
            ((HttpServletResponse) res).sendRedirect(logon);
        }
        chain.doFilter(req, res);
    }

    protected boolean verifyAccess(HttpServletRequest request)
    {
        String resource = request.getRequestURI()
                                            .replaceAll(request.getContextPath(), "");

        while (resource.length() > 0)
        {
            HashMap resources = null;
            String rules = (String) resources.get(resource);
            if (rules != null)
            {
                Usuario user = (Usuario) request.getSession().getAttribute("USUARIO");
                return ( user != null && user.hasRules(rules) );
            }
            else if (!resource.equals("/"))
            {
                int index = resource.lastIndexOf("/");
                if (index > -1)
                {
                    resource = resource.substring(0, index);
                }
            }
            else
            {
                resource = "";
            }
        }
        return true;
    }

    protected String getNextURL(HttpServletRequest request) {
        String url = request.getRequestURI();
        StringBuffer params = new StringBuffer("");

        Enumeration enumParams = request.getParameterNames();

        while (enumParams.hasMoreElements()) {
            String name = (String) enumParams.nextElement();
            String value = request.getParameter(name);
            if (params.length() > 0) {
                params.append("&");
            }
            params.append(name).append("=").append(value);
        }

        return url + "?" + params.toString();
    }

    public void destroy() {
    }
}
web.xml
<filter>
        <filter-name>FiltroSeguranca</filter-name>
        <filter-class>catalogo.controle.seguranca.FiltroSeguranca</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FiltroSeguranca</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Login</title>
    </head>
    <body>
        <form action="login.do" method="post">
            <table>
                <tr><th colspan="2">Login</th></tr>
                <tr>
                    <td>Login: </td>
                    <td><input class="campo" type="text" name="login" /></td>
                </tr>
                <tr>
                  <td>Senha: </td>
                  <td><input class="campo" type="password" name="senha" /></td>
                </tr>
                <tr>
                    <td colspan="2" align="center"><input type="submit" value="Entrar" /></td>
                </tr>
            </table>
        </form>
    </body>
</html>
J

Nao sei se uso meu filtro como esta agora, no post acima, ou como estava antes, com o codigo comentado dentro do doFilter. Como disse usando o doFilter como estava (comentado) a aplicação roda, mas quando eu tento acessar o diretorio que esta com filtro mostra q o IE nao consegue exibir a pagina e se eu usar o filtro novo(post acima) nem roda a aplicação.

J

Dos dois jeitos está dando erro. Nao roda mais a minha aplicação.

C:\Documents and Settings\TI\Desktop\Catalogo\Novo Catalogo\05-04\Catalogo\nbproject\build-impl.xml:611: O módulo não foi implementado.

06/04/2010 09:49:26 org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
06/04/2010 09:49:26 org.apache.catalina.core.StandardContext start
SEVERE: Context [/Catalogo] startup failed due to previous errors

Criado 5 de abril de 2010
Ultima resposta 6 de abr. de 2010
Respostas 10
Participantes 4