{"id":29,"date":"2008-07-28T19:57:49","date_gmt":"2008-07-28T22:57:49","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=29"},"modified":"2008-07-29T21:21:38","modified_gmt":"2008-07-30T00:21:38","slug":"filtrando-com-grails","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=29","title":{"rendered":"Filtrando com Grails"},"content":{"rendered":"<p>Criar filtros em Grails, assim como a maioria das tarefas, trata-se de uma tarefa incr\u00edvelmente simples se compararmos com o modo como costumamos implement\u00e1-los ao trabalharmos diretamente com Servlets. Apesar de ser poss\u00edvel criar inteceptadores, estes s\u00f3 s\u00e3o eficientes quando precisamos lidar com pouqu\u00edssimos controladores (um no m\u00e1ximo em minha opini\u00e3o). Filtros, no entanto, s\u00e3o criados visando atender um n\u00famero maior de controladores de maneira mais eficiente.<\/p>\n<p>Para demonstrar a cria\u00e7\u00e3o de um filtro, irei usar o exemplo mais clich\u00ea que v\u00eam \u00e0 minha mente: valida\u00e7\u00e3o de usu\u00e1rios. Imaginemos por exemplo como funciona o Orkut: se n\u00e3o estivermos logados nos servi\u00e7os do Google, seremos saudados infinitamente por um formul\u00e1rio de login, e apenas um formul\u00e1rio de login veremos enquanto n\u00e3o fornecermos um login e uma senha v\u00e1lidos. S\u00f3 poderemos acessar nosso perfil e demais p\u00e1ginas do servi\u00e7o se j\u00e1 estivermos corretamente logados no sistema.<\/p>\n<p>Sendo assim, m\u00e3os \u00e0 obra: como tudo no Grails, devemos seguir algumas conven\u00e7\u00f5es na cria\u00e7\u00e3o de nosso filtro. A primeira delas diz respeito ao arquivo no qual definiremos nossos filtros. Dever\u00e1 ser criada uma classe Groovy cujo nome siga a seguinte conven\u00e7\u00e3o: <em>[o nome que voc\u00ea quiser]Filters<\/em>, que por sua vez dever\u00e1 estar implementada em um arquivo presente no diret\u00f3rio <em>\/grails-app\/conf, <\/em>cujo nome ser\u00e1&#8230; [o nome que voc\u00ea quiser]Filters.groovy.<\/p>\n<p>Em nosso exemplo, iremos portanto criar um arquivo chamado AprendendoFilters.groovy. Neste arquivo, devemos incluir um bloco chamado <em>Filters<\/em>, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass AprendendoFilters {\r\ndef Filters = {\r\n\/\/ aqui posso definir quantos filtros quiser, tal como o exposto abaixo:\r\nacessoBasico(controller:&#039;*&#039;, action:&#039;*&#039;) {\r\n\/\/ aqui entrar\u00e1 minha valida\u00e7\u00e3o\r\n}\r\noutroFiltroQualquer(controller:&#039;aquele&#039;, action:&#039;voceSabe&#039;) {\r\n\/\/ No bloco Filters, posso definir QUANTOS filtros quiser (tenha modera\u00e7\u00e3o)\r\n}\r\n}\r\n}\r\n<\/pre>\n<p>H\u00e1 dois tipos de filtros: aqueles voltados a controladores e aqueles voltados a URL&#8217;s espec\u00edficas. O exemplo exposto acima pertence \u00e0 primeira categoria (mais abaixo falo da outra). Destrinchando nosso bloco Filters, pode-se observar que criei dois filtros distintos: o primeiro se aplica a todos os controladores e a todas as a\u00e7\u00f5es referentes aos mesmos. Caso meu projeto estivesse bem padronizado, e todos os meus controladores possu\u00edssem uma action chamada <em>facaBobagem<\/em>, poderia configur\u00e1-lo tal como no c\u00f3digo abaixo sem problemas:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nacessoBasico(controller:&#039;*&#039;, action:&#039;facaBobagem) {\r\n\/\/ Gerencio permiss\u00f5es\r\n}\r\n<\/pre>\n<p>J\u00e1 o segundo exemplo listado, sabe muito melhor o que quer. Aplica-se somente ao controlador <em>aquele<\/em> e deseja interceptar apenas a action <em>voceSabe<\/em>.<\/p>\n<p>Caso eu quisesse implementar um filtro relativo a URL&#8217;s (eis a segunda categoria), poderia implement\u00e1-lo tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\napenasURLs(uri:&#039;\/voceSabe\/**&#039;) {\r\n\/\/ implementa\u00e7\u00e3o\r\n}\r\n<\/pre>\n<p>J\u00e1 no corpo do filtro, voc\u00ea pode definir qual o seu tipo de atua\u00e7\u00e3o. H\u00e1 tr\u00eas tipos de atua\u00e7\u00e3o distintos:<\/p>\n<ul>\n<li>before &#8211; Executa o filtro antes da action em quest\u00e3o<\/li>\n<li>after &#8211; Executa ap\u00f3s a execu\u00e7\u00e3o da action. Recebe como primeiro argumento o modelo aplicado \u00e0 visualiza\u00e7\u00e3o<\/li>\n<li>afterView &#8211; Executado ap\u00f3s a view ter sido renderizada<\/li>\n<\/ul>\n<p>Ent\u00e3o, agora que sabemos as regras b\u00e1sicas de funcionamento de um Filtro, vamos implementar o nosso filtro de gerenciamento de acesso. Observe o c\u00f3digo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nacessoBasico(controller:&#039;*&#039;, action:&#039;*&#039;) {\r\n\/*\r\nRepare: dentro do meu bloco acessoBasico, incluo outro bloco, chamado before\r\n*\/\r\nbefore = {\r\nif (!session.usuario &amp;amp;&amp;amp; !actionName.equals(&#039;login&#039;) {\r\nredirect(controller:&#039;entrada&#039;, action:&#039;apresentacao&#039;)\r\nreturn false\r\n}\r\nreturn true\r\n}\r\n}\r\n<\/pre>\n<p>Como pode ser visto, o filtro atua antes de qualquer action ser executada. Em seu corpo, \u00e9 verificada a presen\u00e7a do atributo <em>usuario<\/em> na sess\u00e3o e, caso o mesmo n\u00e3o esteja presente, e o nome da action seja diferente de <em>login<\/em>, redireciono-o para o controlador <em>entrada<\/em> acessando a action <em>apresentacao<\/em>.<\/p>\n<p>Aonde uma d\u00favida pode surgir: o que vem a ser <em>actionName<\/em>? actionName consiste em uma das propriedades presentes em todos os filtros do Grails. Neste caso, actionName retorna o nome da a\u00e7\u00e3o que est\u00e1 sendo interceptada. Conv\u00e9m mencionar que propriedades presentes nas classes de controle, como <em>session, request, response, flash, params<\/em>, e outras tamb\u00e9m encontram-se presentes para os filtros.<\/p>\n<p>Sendo assim, como pode ser visto, a cria\u00e7\u00e3o de filtros em Grails \u00e9 muito mais simples do que o modo com o qual estamos habituados a trabalhar quando lidamos com Servlets. Nenhum arquivo de configura\u00e7\u00e3o foi tocado, nossa \u00fanica a\u00e7\u00e3o consistiu em criar um arquivo com o nome correto, no lugar correto seguindo algumas conven\u00e7\u00f5es. Convention over Configuration rocks!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Criar filtros em Grails, assim como a maioria das tarefas, trata-se de uma tarefa incr\u00edvelmente simples se compararmos com o modo como costumamos implement\u00e1-los ao trabalharmos diretamente com Servlets. Apesar de ser poss\u00edvel criar inteceptadores, estes s\u00f3 s\u00e3o eficientes quando precisamos lidar com pouqu\u00edssimos controladores (um no m\u00e1ximo em minha opini\u00e3o). Filtros, no entanto, s\u00e3o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-29","post","type-post","status-publish","format-standard","hentry","category-grails"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Filtrando com Grails - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=29\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Filtrando com Grails - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Criar filtros em Grails, assim como a maioria das tarefas, trata-se de uma tarefa incr\u00edvelmente simples se compararmos com o modo como costumamos implement\u00e1-los ao trabalharmos diretamente com Servlets. Apesar de ser poss\u00edvel criar inteceptadores, estes s\u00f3 s\u00e3o eficientes quando precisamos lidar com pouqu\u00edssimos controladores (um no m\u00e1ximo em minha opini\u00e3o). Filtros, no entanto, s\u00e3o [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=29\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2008-07-28T22:57:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2008-07-30T00:21:38+00:00\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=29\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=29\",\"name\":\"Filtrando com Grails - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"datePublished\":\"2008-07-28T22:57:49+00:00\",\"dateModified\":\"2008-07-30T00:21:38+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=29#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=29\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=29#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Filtrando com Grails\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Filtrando com Grails - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=29","og_locale":"pt_BR","og_type":"article","og_title":"Filtrando com Grails - \/dev\/Kico","og_description":"Criar filtros em Grails, assim como a maioria das tarefas, trata-se de uma tarefa incr\u00edvelmente simples se compararmos com o modo como costumamos implement\u00e1-los ao trabalharmos diretamente com Servlets. Apesar de ser poss\u00edvel criar inteceptadores, estes s\u00f3 s\u00e3o eficientes quando precisamos lidar com pouqu\u00edssimos controladores (um no m\u00e1ximo em minha opini\u00e3o). Filtros, no entanto, s\u00e3o [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=29","og_site_name":"\/dev\/Kico","article_published_time":"2008-07-28T22:57:49+00:00","article_modified_time":"2008-07-30T00:21:38+00:00","author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=29","url":"https:\/\/devkico.itexto.com.br\/?p=29","name":"Filtrando com Grails - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"datePublished":"2008-07-28T22:57:49+00:00","dateModified":"2008-07-30T00:21:38+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=29#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=29"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=29#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Filtrando com Grails"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/29"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=29"}],"version-history":[{"count":7,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/29\/revisions"}],"predecessor-version":[{"id":39,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/29\/revisions\/39"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}