Estou com uma dúvida, como eu faria para servir páginas estáticas HTML, usando o mapeamento "/" ? Tentei implementar a seguinte estrutura que segue:
Note que meus arquivos estão fora do WEB-INF, Ok, e meu web.xml está assim:
Bom, com base no meu web.xml, meu filtro de autorização é o primeiro a interceptar qualquer requisição, a estrutura de controle está da seguinte forma:
Algumas considerações antes de partir para as dúvidas, estou usando o maven para "buildar" o projeto, faço o build com mvn clean install
. dentro do meu pom.xml
existe uma linha responsável por sempre enviar o novo .war
compilado para a pasta webapps
do tomcat, na instrução <outputDirectory>
como segue:
Ok até aqui, a aplicação sobe normalmente, o tomcat reconhece o novo .war
, e o atualiza. Como estou no linux, e estou me arriscando desenvolver java web no vscode, utilizei um binário do linux tail
para acompanhar o .log
de saída do tomcat, inserindo as atualizações no final de um arquivo out.log
, tudo com o seguinte comando:
Então, toda vez que é dado o comando mvn clean install
ou mvn install
, o novo arquivo é enviado e o tomcat retorna três linhas:
- faz o "Undeploying" da aplicação antiga.
- e depois faz o "Deploying" do novo
.war
.
1 - A primeira dúvida que tenho. Mesmo eu querendo trabalhar com arquivos .html no padrão MVC, eu tenho que mantelos dentro de WEB-INF
e permitir que os mesmos sejam acessados somente pelos servlets?
2 - Misteriosamente, toda vez que executo a aplicação, mesmo sem definir nada no web.xml, o meu AuthorizationFilter
, que é o meu primeiro filtro, recebe a requisição do index.html
, para saber disso, deixei meu AuthorizationFilter
da seguinte forma:
Como chain.doFilter(req, resp);
está comentado, nada acontece depois dele, ao acessar a aplicação no navegador, com http://localhost:8080/goimob/
recebo a seguinte resposta:
Ou seja, meu tomcat (não sei ao certo se é padrão do tomcat), faz a requisição de index.html
, e meu filtro com mapeamento <url-pattern>/*</url-pattern>
caputra isso, por consequência, não tenho meu arquivo devolvido ao navegador.
Então, como impedir que meus filtros/servlets, interceptem requisições de páginas estáticas? ou então, devo seguir o padrão MVC, e devolver meus HTMLs apenas atráves de request.getRequestDispatcher("index.html").forward(request, response);
por exemplo? mas ai teria outro problema, percebi que meu index.html
, quando é carregado para o navegador, faz com que ele realize novas requisições de recursos, e o filtro também intercepta essa requisições. Desativei o mapping
do meu ControllerFilter
:
E, ativei uma linha do meu AuthorizationFilter
:
Dessa forma, meu primeiro interceptador AuthorizationFilter
, deixa a requisição "rolar". Limpando meu log.out
, gerando um novo .war
e acessando novamente, http://localhost:8080/goimob/
com uma nova sessão, agora percebo que após o arquivo index.html ser carregado, o navegador faz requisições dos arquivos declarados no HTML, e meu filtro/servlet também intercepta isso, o que seria um problema se meu ControllerFilter
tentasse instanciar coisas como /index.html
ou /style.css
... Meu arquivo index
:
Meu log:
Dito tudo isso, qual é a arquitetura correta?, devo deixar meus arquivos estáticos (HTML) dentro ou fora do meu WEB-INF
? se dentro, do WEB-INF
obrigatóriamente as requisições feitas pelo navedor por assets e contéudos para montar a página passaria pelo filtro/servlet correto?, se passar, como fazer com que meu filtro não tente instância-los como se fosse os actions? Repósitorio do projeto, eu sou responsável pelo BackEnd. Tenho ainda mais dúvidas, mas cheguei no limite de 5k caracteres.