Cookies de solo sesión con Javascript

82

Me preguntaba si es posible crear cookies de sesión solo con Javascript. Cuando se cierra el navegador, las cookies deben eliminarse.

No puedo usar nada en el servidor ya que el sitio web es solo HTML ... por lo que no se usa ningún script del lado del servidor.

Leí algo sobre esto aquí: http://blog.lysender.com/2011/08/setting-session-only-cookie-via-javascript/ pero no puedo encontrar más información sobre esto ... así que estaba preguntándose si este método es confiable.

Daan Poron
fuente

Respuestas:

134

Si, eso es correcto.

No incluir una expiresparte creará una cookie de sesión, ya sea que se cree en JavaScript o en el servidor.

Ver https://stackoverflow.com/a/532660/1901857

Rhumborl
fuente
No me funciona y lo intenté de muchas maneras ... Quizás esta respuesta esté desactualizada.
Dan
Las cookies de @Dan Session no funcionan en el caso de la configuración habilitada: "Continuar donde lo dejó" en el navegador. En esos casos, los navegadores no destruirán las cookies de sesión después del cierre.
Taron Saribekyan
@TaronSaribekyan tienes razón pero tienes que pedir a todos los usuarios de tu sitio web que deshabiliten la configuración "Continuar donde lo dejaste". En su lugar, sessionStorage funcionó de inmediato en todos los navegadores.
Dan
50

Una solución más sencilla sería utilizar sessionStorage, en este caso:

var myVariable = "Hello World";

sessionStorage['myvariable'] = myVariable;

var readValue = sessionStorage['myvariable'];
console.log(readValue);

Sin embargo, tenga en cuenta que sessionStorageguarda todo como una cadena, por lo que cuando trabaja con matrices / objetos, puede usar JSON para almacenarlos:

var myVariable = {a:[1,2,3,4], b:"some text"};

sessionStorage['myvariable'] = JSON.stringify(myVariable);
var readValue = JSON.parse(sessionStorage['myvariable']);

Una sesión de página dura mientras el navegador esté abierto y sobrevive a las recargas y restauraciones de la página. Al abrir una página en una nueva pestaña o ventana, se iniciará una nueva sesión.

Entonces, cuando cierra la página / pestaña, los datos se pierden.

Cerbrus
fuente
Sí, el almacenamiento de sesiones es la mejor opción para este caso de uso.
Julien Lafont
11
en realidad ahora estoy usando el almacenamiento de sesión ... pero aparentemente cuando abres una nueva pestaña en Chrome y Firefox no puedes acceder a las cosas que almacenaste en el almacenamiento de sesión ... así que por eso estaba mirando las cookies de sesión: código. google.com/p/chromium/issues/detail?id=165452
Daan Poron
En ese caso, las cookies deberían ser confiables, aunque no tengo idea de qué tan bien soportadas están.
Cerbrus
2
El almacenamiento de sesión (y local) se ve afectado por la Política del mismo origen, por lo que si cambia de http a https, no tendrá acceso a las cosas almacenadas en http (y viceversa)
Jeff Lowery
2
Creo que SessionStoragesolo proporciona una client-onlysolución sin ningún acceso a estos valores en el lado del servidor. En muchos marcos del lado del servidor como ASP.Net y PHP, nos gustaría acceder fácilmente a los valores del lado del cliente que podemos haber almacenado sin usar campos ocultos, etc., y luego las cookies se convierten en una mejor solución ya que las cookies se envían automáticamente al lado del servidor.
Domingo
9

Para crear una cookie de sesión única con un script java, puede usar lo siguiente. Esto funciona para mi.

document.cookie = "cookiename=value; expires=0; path=/";

luego obtenga el valor de la cookie de la siguiente manera

 //get cookie 
var cookiename = getCookie("cookiename");
if (cookiename == "value") {
    //write your script
}

//function getCookie        
function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1);
        if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
    }
    return "";
}

De acuerdo, para admitir IE, podemos dejar "expira" por completo y podemos usar esto

document.cookie = "mtracker=somevalue; path=/";
Gaurav Agarwal
fuente
4
expires = 0 en IE no establece ninguna cookie: blog.lysender.com/2011/08/…
JDandChips
1
expira = "" funciona en IE, y le permite restablecer la expiración de una cookie de sesión, si ha configurado explicitamente que
koolunix
1

Utilice el siguiente código para configurar una cookie de sesión, funcionará hasta que se cierre el navegador. (asegúrese de no cerrar la pestaña)

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+ d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
  }
  function getCookie(cname) {
    var name = cname + "=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    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) {
        return c.substring(name.length, c.length);
      }
    }
    return false;
  }
  
  
  if(getCookie("KoiMilGaya")) {
    //alert('found'); 
    // Cookie found. Display any text like repeat user. // reload, other page visit, close tab and open again.. 
  } else {
    //alert('nothing');
    // Display popup or anthing here. it shows on first visit only.  
    // this will load again when user closer browser and open again. 
    setCookie('KoiMilGaya','1');
  }
Tanay suave
fuente