Problema no botão back do navegador

9:46 am Java EE, Programação

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 Responses

  1. Joselei Says:

    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.

  2. João da Silva Says:

    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.

  3. fabio Says:

    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

  4. PC Services Essex Says:

    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

  5. Fabio Says:

    Muito bom o post.
    Com certeza me ajudou muito.

    Obrigado!!!

Leave a Comment

Your comment

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.