Dúvida p/ configurar filter no web.xml

Olá,

No meu sistema eu não quero que o usuários acessem páginas jsp diretamente digitando a url, e nem que acessem as pastas /imagens,/javascript,/css. O acesso deve ser passar sempre pelo Login do sistema.

Criei um filter e ele funciona corretamente para o acesso das páginas jsp, escrevendo no web.xml:

<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

Como eu faço para que o acesso das pastas também passem por este controle?
Tentei colocar no web.xml o trecho seguinte, mas não deu certo:
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/imagens</url-pattern>
</filter-mapping>

Eu também queria controlar as actions. Só a default.do (que faz o login) poderia entrar quando se digita a url.

Resumindo, eu queria algo assim:
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp,/imagens,/javascript,/css,todos os *.do com exceção de default.do</url-pattern>
</filter-mapping>

Obrigado!

Tem como vc utilizar filtros para seu diretório, mas vc tem q filtrar tudo. Ficaria assim:

&lt;filter-mapping&gt; &lt;filter-name&gt;Filtro&lt;/filter-name&gt; &lt;url-pattern&gt;/imagens/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt;

Mas isso é ruim, pois tudo q é linkado desse diretório será filtrado. Imagino q vc tenha imagens nesse diretório, então todas as imagens serão filtradas. O mesmo irá acontecer com os outros diretórios.

Faça o seguinte:

&lt;welcome-file-list&gt;
    &lt;welcome-file&gt;
        redirect.jsp
    &lt;/welcome-file&gt;
    &lt;welcome-file&gt;
        index.jsp
    &lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;

Repare q eu coloquei como páginas iniciais para o meu contexto “redirect.jsp” e “index.jsp”. Coloque o arquivo “redirect.jsp” dentro dos diretórios /imagens, /javascripts, /css, qd vc acessar esses diretórios o contexto irá procurar pelos arquivos “redirect.jsp” e “index.jsp” ele encontrará o “redirect.jsp” então vc poderá redirecioná-lo pra onde vc quiser.

Para os filtros de ações, vc terá q filtrar cada “.do”, menos o default.do
O mesmo acontece com os .jsp

falows!

para não listar o conteúdo do diretório, vc tb pode desabilitar a listagem do mesmo:

http://jakarta.apache.org/tomcat/tomcat-5.0-doc/default-servlet.html

Obrigado,

Vou tentar o q vc falou.

Resolvi responder a esta dúvida, mesmo sendo antiga, devido este assunto ser um entrave para muitos.
Não existe uma maneira direta pelo web.xml de fazer o usuário não acessar um diretório sem que os arquivos também sofram com essa escolha, como já foi explicado, entretanto, é possível implementar um Filtro para que o acesso ao diretório seja barrado e liberado para os arquivos.
Abaixo, temos o código do Filtro:

package com.iniciante.web.filter;

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;

public class FiltraDiretorio implements Filter {

    public void init(FilterConfig arg0) throws ServletException {
        // Não implementado
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;

        if (!request.getRequestURI().contains(".")){
            // Se não existir "." na url requisitada não é chamada de arquivo (.css, .gif, etc), 
            // mas sim de diretório, por isso redirecionamos
            request.getRequestDispatcher("sua página de erro").forward(req, resp);
        }

        // Aqui é feito o redirecionamento normal, caso seja um arquivo
        chain.doFilter(req,resp);

    }

    public void destroy() {
        //Não Implementado
    }
}

No web.xml, vc adicionaria isso:

     &lt;filter&gt;
        &lt;filter-name&gt;FiltraDiretorio&lt;/filter-name&gt;
        &lt;filter-class&gt;com.iniciante.web.filter.FiltraDiretorio&lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;FiltraDiretorio&lt;/filter-name&gt;
        &lt;url-pattern&gt;/imgs/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;FiltraDiretorio&lt;/filter-name&gt;
        &lt;url-pattern&gt;/css/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;

Caso se queira algo mais “universal”, pode-se criar um filtro com parâmetro de inicialização, onde nesse parâmetro se identifique o recurso de direcionamento. Nesse caso, teríamos que implementar o método init do FiltraDiretorio. Abaixo temos a implementação básica feita as pressas:

package com.iniciante.web.filter;

import java.io.IOException;
import java.util.logging.Logger;
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;

/**
 *
 * @author candido.areas
 * @version 1.0
 */
public class FiltraDiretorio implements Filter {

    Logger log = Logger.getLogger(getClass().getName());
    private String redirect = "";

    public void init(FilterConfig config) throws ServletException {
        redirect = config.getInitParameter("errorPage");
        // Caso o parâmetro de erro não contenha a "/", a adicionamos
        if (!redirect.substring(0, 1).equals("/")) {
            redirect = "/" + redirect;
        }
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        
        HttpServletRequest request = (HttpServletRequest) req;
        
        if (!request.getRequestURI().contains(".")) {
            // Se existir "." na url requisitada, existe um arquivo sendo
            // chamado, tipo style.css ou img.gif, que não seria esse caso.
            // Nesse caso, informamos no log que não é permitido o acesso em diretórios.
            log.info("Regra de Negócio: Não é permitido acessar diretório!");
            log.info("Redirecionando para " + redirect);

            // Direcionamos o usuário para a página de erro.
            request.getRequestDispatcher(redirect).forward(req, resp);
        }

        // É realizado o direcionamento normal da solicitação, caso seja um arqivo.
        chain.doFilter(req, resp);


    }

    public void destroy() {
        // Não implementado
    }
}

O parte responsável pelo filtro no web.xml ficaria:

    &lt;filter-name&gt;FiltraDiretorio&lt;/filter-name&gt;
        &lt;filter-class&gt;com.iniciante.web.filter.FiltraDiretorio&lt;/filter-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;errorPage&lt;/param-name&gt;
            &lt;param-value&gt;paginaErro.jsp&lt;/param-value&gt;
        &lt;/init-param&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;FiltraDiretorio&lt;/filter-name&gt;
        &lt;url-pattern&gt;/imgs/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;FiltraDiretorio&lt;/filter-name&gt;
        &lt;url-pattern&gt;/css/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;

Apenas lembrando: o recurso de erro pode ser uma página JSP ou um direcionamento, como .do, por exemplo.
Um abraço a todos/as!
:smiley: Cândido Areas.