{"id":5,"date":"2008-07-25T23:39:47","date_gmt":"2008-07-26T02:39:47","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=5"},"modified":"2008-07-26T01:12:04","modified_gmt":"2008-07-26T04:12:04","slug":"criando-seu-proprio-codec-de-strings","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=5","title":{"rendered":"Criando seu pr\u00f3prio Codec de strings"},"content":{"rendered":"<p>Grails nos possibilita criar codecs din\u00e2micos de strings de uma maneira incr\u00edvelmente simples. Um dos principais usos para estes codecs consiste na encripta\u00e7\u00e3o\/decripta\u00e7\u00e3o de strings, por\u00e9m, como exporei, mais do que isto, estes codecs na realidade nos possibilitam enriquecer a classe java.lang.String.<\/p>\n<p>O primeiro passo a ser adotado consiste em criar a classe que representa nosso codec. Tal como tudo no Grails, devemos nos ater \u00e0s conven\u00e7\u00f5es definidas pela plataforma. O nome da classe dever\u00e1 seguir a seguinte sintaxe: <strong>[Nome do codec]Codec.groovy<\/strong>, e dever\u00e1 ser criada dentro do diret\u00f3rio <strong>grails-app\/utils<\/strong>.\u00a0<\/p>\n<p>Em nosso exemplo, irei recriar um codec retirado da documenta\u00e7\u00e3o do pr\u00f3prio <a href=\"http:\/\/grails.org\/Simple+Dynamic+Password+Codec\">Grails<\/a>, que pode ser visto logo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport java.security.MessageDigest\r\nimport sun.misc.BASE64Encoder\r\nimport sun.misc.CharacterEncoder\r\nclass SenhaCodec {\r\n\r\n\tstatic encode = { str -&gt;\r\n\t\tMessageDigest md = MessageDigest.getInstance(&#039;SHA&#039;)\r\n\t\tmd.update(str.getBytes(&#039;UTF-8&#039;))\r\n\t\treturn (new BASE64Encoder()).encode(md.digest())\r\n\t}\r\n\r\n}\r\n<\/pre>\n<p>Ao escrevermos um codec, novamente devemos adotar as conven\u00e7\u00f5es definidas pelo Grails. Segundo estas conven\u00e7\u00f5es, devemos implementar pelo menos um dos enclosures est\u00e1ticos <b>encode<\/b> ou <b>decode<\/b>. Ambos recebendo um \u00fanico par\u00e2metro como valor (l\u00f3gicamente, uma String).<\/p>\n<p>Ao iniciarmos nossa aplica\u00e7\u00e3o, Grails ir\u00e1 incluir din\u00e2micamente na classe java.lang.String duas fun\u00e7\u00f5es que retornam um valor do tipo String. S\u00e3o eles: <b>encodeAs[nome do seu codec]<\/b> e <b>decodeAs[nome do seu codec]<\/b>. Em nosso caso, ser\u00e3o criados dois m\u00e9todos: <b>encodeAsSenha<\/b> e <b>decodeAsSenha<\/b>.<\/p>\n<p>Em nosso exemplo, implementei apenas a closure encode, isto porqu\u00ea trata-se de um codificador de senhas, e n\u00e3o \u00e9 uma escolha inteligente armazenar senhas, mesmo que encriptadas em um banco de dados. Sendo assim, armazena-se apenas o hash das mesmas. <\/p>\n<p>Se quisesse portanto utilizar este codec em qualquer parte da minha aplica\u00e7\u00e3o (detalhe, n\u00e3o preciso importar classe alguma, uma vez que todos os m\u00e9todos do meu codec j\u00e1 foram inclu\u00eddos na classe java.lang.String), poderia proceder tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass Usuario {\r\n        String hashSenha\r\n        String senha\r\n        void setSenha(String valor)\r\n        {\r\n              this.senha = valor\r\n              if (valor)\r\n                  this.hashSenha = valor.encodeAsSenha()\r\n        }\r\n\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Grails nos possibilita criar codecs din\u00e2micos de strings de uma maneira incr\u00edvelmente simples. Um dos principais usos para estes codecs consiste na encripta\u00e7\u00e3o\/decripta\u00e7\u00e3o de strings, por\u00e9m, como exporei, mais do que isto, estes codecs na realidade nos possibilitam enriquecer a classe java.lang.String. O primeiro passo a ser adotado consiste em criar a classe que representa [&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-5","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>Criando seu pr\u00f3prio Codec de strings - \/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=5\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Criando seu pr\u00f3prio Codec de strings - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Grails nos possibilita criar codecs din\u00e2micos de strings de uma maneira incr\u00edvelmente simples. Um dos principais usos para estes codecs consiste na encripta\u00e7\u00e3o\/decripta\u00e7\u00e3o de strings, por\u00e9m, como exporei, mais do que isto, estes codecs na realidade nos possibilitam enriquecer a classe java.lang.String. O primeiro passo a ser adotado consiste em criar a classe que representa [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=5\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2008-07-26T02:39:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2008-07-26T04:12:04+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=\"2 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=5\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=5\",\"name\":\"Criando seu pr\u00f3prio Codec de strings - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"datePublished\":\"2008-07-26T02:39:47+00:00\",\"dateModified\":\"2008-07-26T04:12:04+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=5#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=5\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=5#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Criando seu pr\u00f3prio Codec de strings\"}]},{\"@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":"Criando seu pr\u00f3prio Codec de strings - \/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=5","og_locale":"pt_BR","og_type":"article","og_title":"Criando seu pr\u00f3prio Codec de strings - \/dev\/Kico","og_description":"Grails nos possibilita criar codecs din\u00e2micos de strings de uma maneira incr\u00edvelmente simples. Um dos principais usos para estes codecs consiste na encripta\u00e7\u00e3o\/decripta\u00e7\u00e3o de strings, por\u00e9m, como exporei, mais do que isto, estes codecs na realidade nos possibilitam enriquecer a classe java.lang.String. O primeiro passo a ser adotado consiste em criar a classe que representa [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=5","og_site_name":"\/dev\/Kico","article_published_time":"2008-07-26T02:39:47+00:00","article_modified_time":"2008-07-26T04:12:04+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":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=5","url":"https:\/\/devkico.itexto.com.br\/?p=5","name":"Criando seu pr\u00f3prio Codec de strings - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"datePublished":"2008-07-26T02:39:47+00:00","dateModified":"2008-07-26T04:12:04+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=5#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=5"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=5#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Criando seu pr\u00f3prio Codec de strings"}]},{"@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\/5"}],"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=5"}],"version-history":[{"count":3,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/5\/revisions"}],"predecessor-version":[{"id":15,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/5\/revisions\/15"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}