Created
February 27, 2017 18:43
-
-
Save dsharrison/a417db2917f6238a1c386063e1c5d133 to your computer and use it in GitHub Desktop.
Transfer custom cookies in a community between Lightning and Visualforce with Locker Service enabled.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Transfer cookies between Lightning (with Locker Service) and Visualforce. Cookies | |
* must be set as URL parameters and the "nextURL" parameter must be supplied. | |
* Cookies will be set for apex using the apex__ prefix and will be set for | |
* Lightning (with Locker Service) using the LSKey[<namespace>] prefix. Note that | |
* all cookies will be set as session cookies. If cookies should be given an | |
* expiration, the next page you navigate to should adjust the cookie expiration. | |
*/ | |
(function() { | |
/** | |
* The namespace for your application. If this is not in a package, set the | |
* namespace to "c". Note that this is case sensitive. | |
* @type {String} | |
*/ | |
var namespace = '<YOUR_NAMESPACE>'; | |
/** | |
* Create a cookie for the given name, value, and expiration in days. | |
* @param {String} name The name of the cookie to set. | |
* @param {String} value The value of the cookie to set. | |
* @param {Integer} days The number of days the cookie is good for. If not | |
* supplied a session cookie will be set. | |
*/ | |
function createCookie(name, value, days) { | |
var expires; | |
if(days) { | |
var date = new Date(); | |
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); | |
expires = "; expires=" + date.toGMTString(); | |
} | |
else { | |
expires = ""; | |
} | |
// Note: the name would usually be escaped when setting a cookie but | |
// Locker Service uses braces in the cookie name. | |
document.cookie = name + "=" + escape(value) + expires + "; path=/"; | |
} | |
/** | |
* Get the query parameters for the current url as an object. | |
* @return {Object} An object with a key for each query parameter. | |
*/ | |
function getQueryParams() { | |
var qs = window.location.search.split('+').join(' '); | |
var params = {}; | |
var tokens; | |
var re = /[?&]?([^=]+)=([^&]*)/g; | |
while((tokens = re.exec(qs)) !== null) { | |
params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); | |
} | |
return params; | |
} | |
/** | |
* Set cookies for both Apex and Visualforce for the given name and value. | |
* @param {String} name The cookie name. | |
* @param {String} value The cookie value. | |
*/ | |
function setCookies(name, value) { | |
createCookie(getApexCookieName(name), value, null); | |
createCookie(getLightningCookieName(name), value, null); | |
} | |
/** | |
* Get the apex specific cookie name. | |
* @param {String} name The generic cookie name. | |
* @return {String} The name of the cookie as handled in Apex. | |
*/ | |
function getApexCookieName(name) { | |
return 'apex__' + name; | |
} | |
/** | |
* Get the Lightning (Locker Service) specific cookie name. | |
* @param {String} name The generic cookie name. | |
* @return {String} The name of the cookie as handled in Locker Service. | |
*/ | |
function getLightningCookieName(name) { | |
return 'LSKey[' + namespace + ']' + name; | |
} | |
/** | |
* Transfer all url parameters to Apex and Lightning (with Locker Service) | |
* cookies. This will update window.location to nextURL after all cookies have | |
* been set. | |
* @throws An exception if the "nextURL" query parameter is not present on | |
* the page. | |
*/ | |
function doTransfer() { | |
var params = getQueryParams(); | |
var nextURL = params.nextURL; | |
delete params.nextURL; | |
if(!nextURL) { | |
throw 'No next page found. Please ensure the nextURL parameter is set in the URL. Note that this is case sensitive.'; | |
} | |
for(var key in params) { | |
if(params.hasOwnProperty(key)) { | |
setCookies(key, params[key]); | |
} | |
} | |
window.location = nextURL; | |
} | |
// Run the transfer which will redirect the user after updating all | |
// cookie values. | |
doTransfer(); | |
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<apex:page showHeader="false" sidebar="false"> | |
<!-- | |
Replace <your_resource> with the name of the static resource with | |
your application files in it. This assumes that you are using a zipped static | |
resource with your javascript files in a 'js/' folder. | |
--> | |
<apex:includeScript value="{!URLFOR($Resource.<your_resource>, '/js/transfer-session.js')}" /> | |
</apex:page> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment