{"id":812,"date":"2012-01-20T22:05:00","date_gmt":"2012-01-20T22:05:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/whateverorigin-combat-the-same-origin-policy-with-heroku-and-play-framework.html"},"modified":"2012-10-21T22:42:50","modified_gmt":"2012-10-21T22:42:50","slug":"whateverorigin-combat-same-origin","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html","title":{"rendered":"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">A little while ago, while <a href=\"http:\/\/ripper234.com\/p\/bitcoin-pie\/\">coding <\/a><a href=\"http:\/\/bitcoinpie.com\/\">Bitcoin Pie<\/a>, I found the need to overcome the notorious <a href=\"http:\/\/en.wikipedia.org\/wiki\/Same_origin_policy\">Same Origin Policy<\/a> that limits the domains javascript running on a client\u2019s browser can access. <a href=\"http:\/\/stackoverflow.com\/questions\/3076414\/ways-to-circumvent-the-same-origin-policy\">Via Stack Overflow<\/a> I found a site called <a href=\"http:\/\/anyorigin.com\/\">Any Origin<\/a>, that\u2019s basically the easiest way to defeat Same Origin Policy without setting up a dedicated server.<\/p>\n<p>All was well, until about a week ago,  Any Origin stopped working for some (but not all) https requests. It just so happened that in that time I had gained some experience with Play! and Heroku, which enabled me to quickly build an open source clone of Any Origin called <a href=\"http:\/\/whateverorigin.org\/\">Whatever Origin (.org!)<\/a> (on <a href=\"https:\/\/github.com\/ripper234\/Whatever-Origin\">github<\/a>). For those unfamiliar with Play! and Heroku, let me give a short introduction:<\/p>\n<p><a href=\"http:\/\/heroku.com\/\">Heroku <\/a>is one of the leading <a href=\"http:\/\/en.wikipedia.org\/wiki\/Platform_as_a_service\">PaaS <\/a>providers. PaaS is just a fancy way of saying \u201cLet us manage your servers, scalability, and security \u2026 you just focus on writing the appliaction.\u201d Heroku started as a Ruby shop, but they now support <a href=\"http:\/\/devcenter.heroku.com\/articles\/cedar\">a variety<\/a> of programming languages and platforms including python, java, scala, javascript\/Node.Js. What\u2019s extra cool about them is that they offer a<a href=\"http:\/\/addons.heroku.com\/\"> huge set of addons<\/a> ranging from simple stuff like Custom Domains and Logging through scheduling, email, SMS, and up to more powerful addons like <a href=\"http:\/\/redis.io\/\">Redis<\/a>, <a href=\"http:\/\/neo4j.org\/\">Neo4j <\/a>and <a href=\"http:\/\/memcached.org\/\">Memcached<\/a>.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Now for the application part, I had recently found <a href=\"http:\/\/www.playframework.org\/\">Play! Framework<\/a>. Play is a Java\/Scala framework for writing web applications that borrows from the Ruby on Rails \/ Django ideas of providing you with a complete pre-built solution, letting you focus on writing your actual business logic, while allowing you to customize everything later if needed. I encourage you to watch the 12 minute video on Play!\u2019s homepage, it shows how to achieve powerful capabilities from literally scratch. Play! is natively supported at Heroku, so really all you need to do to get a production app running is:<\/p>\n<ul style=\"text-align: left\">\n<li>play new<\/li>\n<li>Write some business logic (Controllers\/Views\/whatnot)<\/li>\n<li>git init \u2026 git commit<\/li>\n<li>\u201cheroku apps add\u201d to create a new app (don\u2019t forget to add \u201c\u2013stack cedar\u201d to use the latest generation Cedar stack)<\/li>\n<li>\u201cgit push heroku master\u201d to upload a new version of your app \u2026 it\u2019s automatically built and deployed.<\/li>\n<\/ul>\n<p>Armed with these tools (which really took me only a few days to learn), I set out to build Whatever Origin. Handling JSONP requests is an IO-bound task \u2013 your server basically does an HTTP request, and when it completes, it sends the response to your client wrapped in some javascript\/JSON magic. Luckily Play!\u2019s support for Async IO is really sweet and simple. Just look at my <a href=\"https:\/\/github.com\/ripper234\/Whatever-Origin\/blob\/master\/app\/controllers\/Application.java\">single get method<\/a>:<\/p>\n<pre class=\"brush: java;\">public static void get(final String url, final String callback) {\r\n    F.Promise&lt;WS.HttpResponse&gt; remoteCall = WS.url(url).getAsync();\r\n \r\n    await(remoteCall, new F.Action&lt;WS.HttpResponse&gt;() {\r\n        public void invoke(WS.HttpResponse result) {\r\n            String responseStr = getResponseStr(result, url);   \/\/ code for getResponseStr() not included in this snippet to hide some ugly irrelevant details\r\n \r\n            \/\/ http:\/\/blog.altosresearch.com\/supporting-the-jsonp-callback-protocol-with-jquery-and-java\/\r\n            if ( callback != null ) {\r\n                response.contentType = \"application\/x-javascript\";\r\n                responseStr = callback + \"(\" + responseStr + \")\";\r\n            } else {\r\n                response.contentType = \"application\/json\";\r\n            }\r\n \r\n            renderJSON(responseStr);\r\n        }\r\n    });\r\n}\r\n<\/pre>\n<p>The first line initiates an async fetch of the requested URL, followed by registration to the completion event, and releasing the thread. You could almost think this is <a href=\"http:\/\/node.js\/\">Node.Js<\/a>!<\/p>\n<p>What actually took me the longest time to develop and debug was <a href=\"http:\/\/en.wikipedia.org\/wiki\/JSONP\">JSONP <\/a>itself. The information I found about it, and jQuery\u2019s client-side support was a little tricky to find, and I spent a few hours struggling with overly escaped JSON and other fun stuff. After that was done, I simply pushed it to github, registered the whateverorigin.org domain for a measly $7 a year, and replaced anyorigin.com with whateverorigin.org in Bitcoin Pie\u2019s code, and voila \u2013 the site was back online.<\/p>\n<p>I really like developing websites in 2011 \u2013 there are entire industries out there that have set out to make it easy for individuals \/ small startups to build amazing products.<\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/ripper234.com\/p\/whatever-origin-combat-same-origin-policy-with-heroku-and-play-framework\/\">WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework<\/a>&nbsp;from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a>&nbsp;Ron Gross at the&nbsp;<a href=\"http:\/\/ripper234.com\/\">A Quantum Immortal<\/a>&nbsp;blog<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A little while ago, while coding Bitcoin Pie, I found the need to overcome the notorious Same Origin Policy that limits the domains javascript running on a client\u2019s browser can access. Via Stack Overflow I found a site called Any Origin, that\u2019s basically the easiest way to defeat Same Origin Policy without setting up a &hellip;<\/p>\n","protected":false},"author":72,"featured_media":215,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[222,177],"class_list":["post-812","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-heroku","tag-play-framework"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"A little while ago, while coding Bitcoin Pie, I found the need to overcome the notorious Same Origin Policy that limits the domains javascript running on\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"A little while ago, while coding Bitcoin Pie, I found the need to overcome the notorious Same Origin Policy that limits the domains javascript running on\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-01-20T22:05:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T22:42:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/play-framework-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ron Gross\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ron Gross\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html\"},\"author\":{\"name\":\"Ron Gross\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/afa10d44284ba128dc1f606753e71cfc\"},\"headline\":\"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework\",\"datePublished\":\"2012-01-20T22:05:00+00:00\",\"dateModified\":\"2012-10-21T22:42:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html\"},\"wordCount\":626,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/play-framework-logo.jpg\",\"keywords\":[\"Heroku\",\"Play Framework\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html\",\"name\":\"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/play-framework-logo.jpg\",\"datePublished\":\"2012-01-20T22:05:00+00:00\",\"dateModified\":\"2012-10-21T22:42:50+00:00\",\"description\":\"A little while ago, while coding Bitcoin Pie, I found the need to overcome the notorious Same Origin Policy that limits the domains javascript running on\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/play-framework-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/play-framework-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/01\\\/whateverorigin-combat-same-origin.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/afa10d44284ba128dc1f606753e71cfc\",\"name\":\"Ron Gross\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b45e68e77c19a8f5a83c2fa2f2398ec6b0f44a022fc840394a94b00fd7c9c658?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b45e68e77c19a8f5a83c2fa2f2398ec6b0f44a022fc840394a94b00fd7c9c658?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b45e68e77c19a8f5a83c2fa2f2398ec6b0f44a022fc840394a94b00fd7c9c658?s=96&d=mm&r=g\",\"caption\":\"Ron Gross\"},\"sameAs\":[\"http:\\\/\\\/ripper234.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Ron-Gross\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework - Java Code Geeks","description":"A little while ago, while coding Bitcoin Pie, I found the need to overcome the notorious Same Origin Policy that limits the domains javascript running on","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:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html","og_locale":"en_US","og_type":"article","og_title":"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework - Java Code Geeks","og_description":"A little while ago, while coding Bitcoin Pie, I found the need to overcome the notorious Same Origin Policy that limits the domains javascript running on","og_url":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-01-20T22:05:00+00:00","article_modified_time":"2012-10-21T22:42:50+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/play-framework-logo.jpg","type":"image\/jpeg"}],"author":"Ron Gross","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Ron Gross","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html"},"author":{"name":"Ron Gross","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/afa10d44284ba128dc1f606753e71cfc"},"headline":"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework","datePublished":"2012-01-20T22:05:00+00:00","dateModified":"2012-10-21T22:42:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html"},"wordCount":626,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/play-framework-logo.jpg","keywords":["Heroku","Play Framework"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html","url":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html","name":"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/play-framework-logo.jpg","datePublished":"2012-01-20T22:05:00+00:00","dateModified":"2012-10-21T22:42:50+00:00","description":"A little while ago, while coding Bitcoin Pie, I found the need to overcome the notorious Same Origin Policy that limits the domains javascript running on","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/play-framework-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/play-framework-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/01\/whateverorigin-combat-same-origin.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"WhateverOrigin \u2013 Combat the Same Origin Policy with Heroku and Play! Framework"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/afa10d44284ba128dc1f606753e71cfc","name":"Ron Gross","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/b45e68e77c19a8f5a83c2fa2f2398ec6b0f44a022fc840394a94b00fd7c9c658?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b45e68e77c19a8f5a83c2fa2f2398ec6b0f44a022fc840394a94b00fd7c9c658?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b45e68e77c19a8f5a83c2fa2f2398ec6b0f44a022fc840394a94b00fd7c9c658?s=96&d=mm&r=g","caption":"Ron Gross"},"sameAs":["http:\/\/ripper234.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Ron-Gross"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/72"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=812"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/812\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/215"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}