Utilizzando la stessa origine: googleusercontent.com
Condividere i Cookies tra progetti diversi in Google Apps Script
Creare e leggere cookie può rivelarsi utile in molte situazioni, come ad esempio salvare le dovute informazioni dell'utente in corso per far sì che all'accesso successivo alla Web App quest'ultimo si trovi loggato in modo automatico così come in un e-commerce per far ritrovare all'utente il carrello così come lo aveva lasciato l'ultima volta.
Con la presenza del Properties Service, che permette di salvare coppie chiave:valore a livello di script, utente o documento di uno script, add-on o web app, l'utilizzo dei cookie in Google Apps Script non trova particolare spazio di diffusione tuttavia essendo uno strumento da poter prendere in considerazione vale la pena descriverlo considerando anche che è possibile condividere tra diversi progetti l'informazione presente all'interno di un cookie.
Ponendo di avere il seguente template HTML (richiamato in doGet con il metodo createHtmlOutputFromFile di HtmlService), al click sul button 'set cookie' viene inviata la funzione che ho appositamente chiamato setCookie passando come parametri, nel caso specifico dell'esempio, il nome del cookie ('username'), il suo valore ('Michele Pisani') e la durata del cookie (365):
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<input type="button" onClick="setCookie('username', 'Michele Pisani', 365);" value="set cookie" />
<input type="button" onClick="showCookie('username');" value="get cookie" />
<div id="output" style="margin-top: 10px;"></div>
<script>
function setCookie(cname, cvalue, exdays) {
var d = new Date();
var dt = d.getTime();
d.setTime(dt + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
var cn = "";
for(var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
cn = c.substring(name.length, c.length);
}
}
return cn;
}
function showCookie(cname) {
var res = getCookie(cname);
var div = document.getElementById('output');
div.innerHTML = res;
}
</script>
</body>
</html>
La riga di codice che genera il cookie è la seguente:
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
Ed il cookie generato, salvato nel browser, viene assegnato ad un terzo livello del nome a dominio googleusercontent.com relativo allo script in uso, nel caso specifico dell'esempio:
n-expqfjpwavrxuo2rhi3usqepbdrsyu4foclfoni-0lu-script.googleusercontent.com
La figura seguente (Fig. 1) mostra quanto appena descritto:
Di conseguenza solo lo script che ha generato il cookie può accedere al cookie stesso.
E' possibile tuttavia forzare la scrittura del cookie sul solo dominio di secondo livello, comune a tutti gli script, ovvero googleusercontent.com.
Per poter eseguire questa operazione è necessario dichiarare il dominio di cui sopra all'interno della stringa che genera il cookie (aggiungendo la parte: domain=.googleusercontent.com), pertanto l'ultimo codice mostrato diventerà:
document.cookie = cname + "=" + cvalue + ";" + expires + ";domain=.googleusercontent.com;path=/";
In questo modo, ponendo di avere 2 script distinti (intesi come due diversi progetti) è possibile salvare un valore all'interno del cookie tramite uno script e leggerne il contenuto dall'altro script.
La figura seguente (Fig. 2) mostra lo stesso cookie assegnato a livello di dominio di secondo livello:
Questo tipo di approccio può essere utilizzato anche all'interno di un Google Site incorporando gli script, pubblicati come Web App, tramite il loro indirizzo di pubblicazione.
Per utilità e completezza di informazione riporto di seguito 2 funzioni Javascript rispettivamente per la creazione e la lettura di un cookie:
// setCookie: crea un cookie accettando in ingresso i parametri relativi al nome, valore e durata (in giorni) del cookie
// Nel caso si volesse definire il dominio di creazione del cookie aggiungere alla relativa stringa: domain=.nome_domino;
function setCookie(cname, cvalue, exdays) {
var d = new Date();
var dt = d.getTime();
d.setTime(dt + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
// getCookie: restituisce, qualora presente, il valore del cookie in base al nome passato come parametro
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
var cn = "";
for(var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
cn = c.substring(name.length, c.length);
}
}
return cn;
}
Non ci sono commenti
Nessuno ha ancora commentato questo articolo, fallo tu per primo!
scrivi un commento