{"id":8,"date":"2008-05-13T09:46:16","date_gmt":"2008-05-13T12:46:16","guid":{"rendered":"http:\/\/www.fnbrandao.com.br\/blog\/?p=8"},"modified":"2008-05-26T10:25:06","modified_gmt":"2008-05-26T13:25:06","slug":"problema-no-botao-back-do-navegador","status":"publish","type":"post","link":"https:\/\/www.fnbrandao.com.br\/blog\/2008\/05\/problema-no-botao-back-do-navegador\/","title":{"rendered":"Problema no bot\u00e3o back do navegador"},"content":{"rendered":"<p>O bot\u00e3o back do navegador \u00e9 muito \u00fatil ao usu\u00e1rio para ele conseguir navegar entre diferentes p\u00e1ginas e websites. Entretanto, o bot\u00e3o back pode trazer diversos problemas aos sites. Uma maneira de <em>&#8220;travar&#8221;<\/em> o bot\u00e3o \u00e9 desabilitar completamente o cache das p\u00e1ginas que n\u00e3o devem permitir que sejam acessadas atrav\u00e9s do bot\u00e3o back.<br \/>\nPara se fazer isso no Java EE basta apenas criar um filtro e mape\u00e1-lo para as url&#8217;s necess\u00e1rias.<br \/>\nSegue abaixo o c\u00f3digo do filtro:<\/p>\n<p><code><\/p>\n<pre>\r\nimport java.io.IOException;\r\n\r\nimport javax.servlet.Filter;\r\nimport javax.servlet.FilterChain;\r\nimport javax.servlet.FilterConfig;\r\nimport javax.servlet.ServletException;\r\nimport javax.servlet.ServletRequest;\r\nimport javax.servlet.ServletResponse;\r\nimport javax.servlet.http.HttpServletResponse;\r\n\r\npublic class ClearCacheFilter implements Filter {\r\n\r\n    public void destroy() {\r\n    }\r\n\r\n    public void doFilter(ServletRequest request, ServletResponse response,\r\n            FilterChain chain) throws IOException, ServletException {\r\n        HttpServletResponse httpResponse = (HttpServletResponse) response;\r\n\r\n        httpResponse.setHeader(\"Expires\", \"Sat, 1 Jan 1990 12:00:00 GMT\");\r\n        httpResponse.setHeader(\"Cache-Control\", \"no-store, no-cache, must-revalidate\");\r\n        httpResponse.addHeader(\"Cache-Control\", \"post-check=0, pre-check=0\");\r\n        httpResponse.setHeader(\"Pragma\", \"no-cache\");\r\n        \r\n        chain.doFilter(request, response);\r\n    }\r\n\r\n    public void init(FilterConfig filterConfig) throws ServletException {\r\n    }\r\n\r\n}\r\n<\/pre>\n<p><\/code><\/p>\n<p>Basicamente o que o filtro faz \u00e9 setar as diretivas de cache para o navegador. Primeiro ele seta a data de expira\u00e7\u00e3o da p\u00e1gina para uma data passada. Depois, o c\u00f3digo seta 3 diretivas para desabilitar o cache:<\/p>\n<ul>\n<li><strong>no-store:<\/strong> n\u00e3o armazena o conte\u00fado no cache<\/li>\n<li><strong>no-cache:<\/strong> o browser deve enviar o request para o servidor mesmo se ele possuir uma c\u00f3pia do que ser\u00e1 enviado<\/li>\n<li><strong>must-revalidate:<\/strong> revalida o cache em outro request, se estiver expirado<\/li>\n<\/ul>\n<p>Depois, s\u00e3o setadas duas diretivas espec\u00edficas do Internet Explorer. Estas diretivas indicam que o conte\u00fado sempre deve ser atualizado. E por \u00faltimo, \u00e9 desabilitado o cache para o protocolo HTTP\/1.0 (j\u00e1 que as outras 3 s\u00e3o espec\u00edficas do HTTP\/1.1).<\/p>\n<p>Por \u00faltimo \u00e9 preciso configurar o filtro na aplica\u00e7\u00e3o web. Segue abaixo o trecho de c\u00f3digo referente \u00e0 configura\u00e7\u00e3o para o filtro, bem como para ele ser aplicado a todas as p\u00e1ginas da aplica\u00e7\u00e3o:<br \/>\n<code><\/p>\n<pre>\r\n&lt;filter&gt;\r\n\t&lt;filter-name&gt;ClearCacheFilter&lt;\/filter-name&gt;\r\n\t&lt;filter-class&gt;br.com.uol.ps.common.web.ClearCacheFilter&lt;\/filter-class&gt;\r\n&lt;\/filter&gt;\r\n\r\n&lt;filter-mapping&gt;\r\n\t&lt;filter-name&gt;ClearCacheFilter&lt;\/filter-name&gt;\r\n\t&lt;url-pattern&gt;\/*&lt;\/url-pattern&gt;\r\n&lt;\/filter-mapping&gt;\r\n<\/pre>\n<p><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O bot\u00e3o back do navegador \u00e9 muito \u00fatil ao usu\u00e1rio para ele conseguir navegar entre diferentes p\u00e1ginas e websites. Entretanto, o bot\u00e3o back pode trazer diversos problemas aos sites. Uma maneira de &#8220;travar&#8221; o bot\u00e3o \u00e9 desabilitar completamente o cache das p\u00e1ginas que n\u00e3o devem permitir que sejam acessadas atrav\u00e9s do bot\u00e3o back. Para se [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12,3],"tags":[10,15,14,13],"class_list":["post-8","post","type-post","status-publish","format-standard","hentry","category-java-ee-programacao","category-programacao","tag-back-button","tag-cache","tag-filtro","tag-jee"],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/posts\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/comments?post=8"}],"version-history":[{"count":0,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/posts\/8\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/media?parent=8"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/categories?post=8"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/tags?post=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}