{"id":8539,"date":"2012-09-25T02:49:09","date_gmt":"2012-09-24T21:19:09","guid":{"rendered":"https:\/\/2thenew.today\/blog\/?p=8539"},"modified":"2012-09-25T02:49:09","modified_gmt":"2012-09-24T21:19:09","slug":"enhance-httpservletrequest-using-metaprogramming","status":"publish","type":"post","link":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/","title":{"rendered":"Enhance HttpServletRequest using metaprogramming"},"content":{"rendered":"<p style='padding-bottom:10px;'>Most of the times we use <code>request.getHeader(\"user-agent\")<\/code> to get the client browser user-agent details inside the Grails Filters or Controllers. User-agent is one of the examples. There are so many such methods e.g. method for checking whether the request was an ajax call, getting IP address of the client machine, checking whether the request is made by a mobile browser etc. Lets create a class with a static method (create file in<code> grails-app\/src<\/code> source folder) :\n<\/p>\n<p>[groovy]<br \/>\nimport javax.servlet.http.HttpServletRequest<\/p>\n<p>class HttpRequestMetaClassEnhancer{<br \/>\n  public static void enhanceRequest(){<br \/>\n    HttpServletRequest.metaClass {<br \/>\n       getRemoteIPAddress = {<br \/>\n           delegate.getHeader(&quot;x-forwarded-for&quot;) ?: delegate.remoteAddr<br \/>\n       }<br \/>\n       isAjax = {<br \/>\n           delegate.getHeader(&quot;X-Requested-With&quot;) == &quot;XMLHttpRequest&quot;<br \/>\n       }<br \/>\n       getSiteUrl = {<br \/>\n           delegate.scheme + &quot;:\/\/&quot; + delegate.serverName + &quot;:&quot; + delegate.serverPort + delegate.getContextPath()<br \/>\n       }<br \/>\n       getUserAgent = {<br \/>\n           delegate.getHeader(&quot;User-Agent&quot;)<br \/>\n       }<br \/>\n       isMobileBrowser = {<br \/>\n\t   delegate.getHeader(&quot;User-Agent&quot;).matches(&quot;(?i).*(android|iphone|ipad).*&quot;)<br \/>\n\t}<br \/>\n          \/*<br \/>\n              Keep adding methods that are common to projects as comment to blog.<br \/>\n              I will update this blog with your helper methods<br \/>\n           *\/<br \/>\n     }<br \/>\n  }<br \/>\n}<br \/>\n[\/groovy]<\/p>\n<p style='padding-bottom:10px;'>\nIn most of the projects, we use an <em>inline plugin<\/em> which adds our commonly used utility methods to respective groovy classes using groovy metaprogramming. <code>Bootstrap.groovy<\/code> is another place for adding dynamic behaviour to classes like <code>HttpServletRequest<\/code> so that it is ready before being used inside <em>Grails Controllers\/Filters <\/em>etc. Just make a call to <code>enahceRequest<\/code> static method of <code>HttpRequestMetaClassEnhancer<\/code> class in init closure of <code>Bootstrap.groovy<\/code> file.\n<\/p>\n<p>[groovy]<br \/>\nclass Bootstrap{<br \/>\n    def init = { servletContext -&gt;<br \/>\n\tHttpRequestMetaClassEnhancer.enahceRequest()<br \/>\n \t}<br \/>\n    def destroy = {}<br \/>\n}<\/p>\n<p>[\/groovy]<\/p>\n<p style='padding-bottom:10px;'>\nNow you can access properties like <code>remoteIPAddress<\/code>, <code>ajax<\/code>, <code>siteUrl<\/code>, <code>userAgent<\/code>, <code>mobileBrowser<\/code> etc. on request object in Grails Filters\/Controllers. See below a sample filter which prints request related information on each request received to the server log.\n<\/p>\n<p>[groovy]<br \/>\nclass ApplicationFilters{<br \/>\ndef filters = {<br \/>\n        logParams(controller: &#8216;*&#8217;, action: &#8216;*&#8217;) {<br \/>\n            before = {<br \/>\n                log.info &quot;[IP: ${request.remoteIPAddress},&quot;+<br \/>\n                           &quot;url: ${params.controller}\/${params.action},&quot;+<br \/>\n                           &quot;ajax: ${request.ajax},&quot;+<br \/>\n                           &quot;Mobile browser: ${request.mobileBrowser} ]:&quot;+<br \/>\n                            params.findAll {![&#8216;password&#8217;, &#8216;passwd&#8217;, &#8216;controller&#8217;, &#8216;action&#8217;].contains(it.key)}<br \/>\n           }<br \/>\n      }<br \/>\n}<\/p>\n<p>[\/groovy]<\/p>\n<p>Or a sample controller : <\/p>\n<p>[groovy]<br \/>\nclass UtilController{<br \/>\n  def index(){<br \/>\n      if(request.mobileBrowser){<br \/>\n          render &quot;You got a nice mobile. You are viewing : &quot;+request.siteUrl<br \/>\n      }else{<br \/>\n           request.ajax ? render(view:&#8217;index) : render(template :&#8217;tabularData&#8217;)<br \/>\n      }<br \/>\n  }<br \/>\n}<br \/>\n[\/groovy]<\/p>\n<p style='padding-bottom:10px;'>\nThanks to all the contributors whose helper methods has made this a long blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.<\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":6,"footnotes":""},"categories":[7],"tags":[1068,4840,1062,9,1061,1063,1066,145,1064,1065,1067],"class_list":["post-8539","post","type-post","status-publish","format-standard","hentry","category-grails","tag-bootstrap-groovy","tag-grails","tag-grails-filter","tag-groovy","tag-http-request","tag-isajax","tag-ismobilebrowser","tag-metaprogramming","tag-remoteipaddress","tag-siteurl","tag-useragent"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Bhagwat Kumar\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"TO THE NEW BLOG\" \/>\n\t\t<meta property=\"og:type\" content=\"blog\" \/>\n\t\t<meta property=\"og:title\" content=\"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@tothenew\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#article\",\"name\":\"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog\",\"headline\":\"Enhance HttpServletRequest using metaprogramming\",\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhagwat\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"},\"datePublished\":\"2012-09-25T02:49:09+05:30\",\"dateModified\":\"2012-09-25T02:49:09+05:30\",\"inLanguage\":\"en-US\",\"commentCount\":1,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#webpage\"},\"articleSection\":\"Grails, Bootstrap.groovy, Grails, grails filter, Groovy, http request, isAjax, isMobileBrowser, MetaProgramming, remoteIPAddress, siteUrl, userAgent\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/#listItem\",\"name\":\"Grails\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/#listItem\",\"position\":2,\"name\":\"Grails\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#listItem\",\"name\":\"Enhance HttpServletRequest using metaprogramming\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#listItem\",\"position\":3,\"name\":\"Enhance HttpServletRequest using metaprogramming\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/#listItem\",\"name\":\"Grails\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\",\"name\":\"TO THE NEW Blog\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhagwat\\\/#author\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhagwat\\\/\",\"name\":\"Bhagwat Kumar\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d6c506f803fe26906ef802b1eaee463146e449a8b5b3d1f7e4ebc715b933d620?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Bhagwat Kumar\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#webpage\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/\",\"name\":\"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog\",\"description\":\"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/enhance-httpservletrequest-using-metaprogramming\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhagwat\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhagwat\\\/#author\"},\"datePublished\":\"2012-09-25T02:49:09+05:30\",\"dateModified\":\"2012-09-25T02:49:09+05:30\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\",\"name\":\"TO THE NEW Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog","description":"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.","canonical_url":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#article","name":"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog","headline":"Enhance HttpServletRequest using metaprogramming","author":{"@id":"https:\/\/2thenew.today\/blog\/author\/bhagwat\/#author"},"publisher":{"@id":"https:\/\/2thenew.today\/blog\/#organization"},"datePublished":"2012-09-25T02:49:09+05:30","dateModified":"2012-09-25T02:49:09+05:30","inLanguage":"en-US","commentCount":1,"mainEntityOfPage":{"@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#webpage"},"isPartOf":{"@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#webpage"},"articleSection":"Grails, Bootstrap.groovy, Grails, grails filter, Groovy, http request, isAjax, isMobileBrowser, MetaProgramming, remoteIPAddress, siteUrl, userAgent"},{"@type":"BreadcrumbList","@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog#listItem","position":1,"name":"Home","item":"https:\/\/2thenew.today\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/grails\/#listItem","name":"Grails"}},{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/grails\/#listItem","position":2,"name":"Grails","item":"https:\/\/2thenew.today\/blog\/category\/grails\/","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#listItem","name":"Enhance HttpServletRequest using metaprogramming"},"previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#listItem","position":3,"name":"Enhance HttpServletRequest using metaprogramming","previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/grails\/#listItem","name":"Grails"}}]},{"@type":"Organization","@id":"https:\/\/2thenew.today\/blog\/#organization","name":"TO THE NEW Blog","url":"https:\/\/2thenew.today\/blog\/"},{"@type":"Person","@id":"https:\/\/2thenew.today\/blog\/author\/bhagwat\/#author","url":"https:\/\/2thenew.today\/blog\/author\/bhagwat\/","name":"Bhagwat Kumar","image":{"@type":"ImageObject","@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d6c506f803fe26906ef802b1eaee463146e449a8b5b3d1f7e4ebc715b933d620?s=96&d=mm&r=g","width":96,"height":96,"caption":"Bhagwat Kumar"}},{"@type":"WebPage","@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#webpage","url":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/","name":"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog","description":"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/2thenew.today\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/#breadcrumblist"},"author":{"@id":"https:\/\/2thenew.today\/blog\/author\/bhagwat\/#author"},"creator":{"@id":"https:\/\/2thenew.today\/blog\/author\/bhagwat\/#author"},"datePublished":"2012-09-25T02:49:09+05:30","dateModified":"2012-09-25T02:49:09+05:30"},{"@type":"WebSite","@id":"https:\/\/2thenew.today\/blog\/#website","url":"https:\/\/2thenew.today\/blog\/","name":"TO THE NEW Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/2thenew.today\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"TO THE NEW BLOG","og:type":"blog","og:title":"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog","og:description":"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.","og:url":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/","og:image":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","og:image:secure_url":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","twitter:card":"summary","twitter:site":"@tothenew","twitter:title":"Enhance HttpServletRequest using metaprogramming | TO THE NEW Blog","twitter:description":"Blog teach you : how to enhance http request object by adding helper methods using groovy meta programming. The blog contains most commonly methods to request object such as isAjax, siteUrl, isMobileBrowser, remoteIPAddress etc. Once they are injected from Bootstrap.groovy init closure, the new methods are available in controllers and filters. Blog shows some use cases where these helper methods has been used successfully.","twitter:image":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png"},"aioseo_meta_data":{"post_id":"8539","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2021-04-29 13:42:17","updated":"2024-02-29 08:48:11","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.today\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.today\/blog\/category\/grails\/\" title=\"Grails\">Grails<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tEnhance HttpServletRequest using metaprogramming\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/2thenew.today\/blog"},{"label":"Grails","link":"https:\/\/2thenew.today\/blog\/category\/grails\/"},{"label":"Enhance HttpServletRequest using metaprogramming","link":"https:\/\/2thenew.today\/blog\/enhance-httpservletrequest-using-metaprogramming\/"}],"_links":{"self":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts\/8539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/comments?post=8539"}],"version-history":[{"count":0,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts\/8539\/revisions"}],"wp:attachment":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/media?parent=8539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/categories?post=8539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/tags?post=8539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}