O botão back do navegador é muito útil ao usuário para ele conseguir navegar entre diferentes páginas e websites. Entretanto, o botão back pode trazer diversos problemas aos sites. Uma maneira de “travar” o botão é desabilitar completamente o cache das páginas que não devem permitir que sejam acessadas através do botão back.
Para se fazer isso no Java EE basta apenas criar um filtro e mapeá-lo para as url’s necessárias.
Segue abaixo o código do filtro:
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.HttpServletResponse; public class ClearCacheFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Expires", "Sat, 1 Jan 1990 12:00:00 GMT"); httpResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); httpResponse.addHeader("Cache-Control", "post-check=0, pre-check=0"); httpResponse.setHeader("Pragma", "no-cache"); chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { } }
Basicamente o que o filtro faz é setar as diretivas de cache para o navegador. Primeiro ele seta a data de expiração da página para uma data passada. Depois, o código seta 3 diretivas para desabilitar o cache:
- no-store: não armazena o conteúdo no cache
- no-cache: o browser deve enviar o request para o servidor mesmo se ele possuir uma cópia do que será enviado
- must-revalidate: revalida o cache em outro request, se estiver expirado
Depois, são setadas duas diretivas específicas do Internet Explorer. Estas diretivas indicam que o conteúdo sempre deve ser atualizado. E por último, é desabilitado o cache para o protocolo HTTP/1.0 (já que as outras 3 são específicas do HTTP/1.1).
Por último é preciso configurar o filtro na aplicação web. Segue abaixo o trecho de código referente à configuração para o filtro, bem como para ele ser aplicado a todas as páginas da aplicação:
<filter> <filter-name>ClearCacheFilter</filter-name> <filter-class>br.com.uol.ps.common.web.ClearCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>ClearCacheFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
5 respostas em “Problema no botão back do navegador”
Muito bom esse filtro… Faz tempo que procuro algo que funcione bem para resolver o problema com o cache dos navegadores, e não havia encontrado nada tão funcional como este. Parabéns pelo post meu amigo.
Isso aí derruba a performance de qualquer aplicação.
Vai fazer com as requisições de imagens, css, javascript e outros conteúdos estáticos sejam feitas o tempo todo. Isso vai onerar o servidor, além de tornar o carregamento das páginas muito mais lento.
João, o que derruba a performance de qualquer aplicação é deixar o conteúdo estático dentro de algum servidor de aplicação (ex.: jboss, weblogic, webspher, glassfish, etc) ou dentro do tomcat. O correto é deixar esse tipo de conteúdo dentro do apache (que tem uma ótima performance para servir conteúdo estático).
Sendo assim, o mapeamento não pegará o conteúdo estático, mas o ideal é alterar o mapeamento somente para as url’s que precisam desse filtro.
Abraços
Thanks for your marvelous posting! I genuibely enjoyed reading it, you can be
a great author. I will be sure to bookmark your blog and definitely will come
back down the road. I want to encourage that yoou continue your great job,
have a nice evening!
my web blog PC Services Essex
Muito bom o post.
Com certeza me ajudou muito.
Obrigado!!!