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:
<filter>
<filter-name>FiltraDiretorio</filter-name>
<filter-class>com.iniciante.web.filter.FiltraDiretorio</filter-class>
</filter>
<filter-mapping>
<filter-name>FiltraDiretorio</filter-name>
<url-pattern>/imgs/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>FiltraDiretorio</filter-name>
<url-pattern>/css/*</url-pattern>
</filter-mapping>
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:
<filter-name>FiltraDiretorio</filter-name>
<filter-class>com.iniciante.web.filter.FiltraDiretorio</filter-class>
<init-param>
<param-name>errorPage</param-name>
<param-value>paginaErro.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FiltraDiretorio</filter-name>
<url-pattern>/imgs/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>FiltraDiretorio</filter-name>
<url-pattern>/css/*</url-pattern>
</filter-mapping>
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!
Cândido Areas.