Сессионные файлы cookie с Javascript


84

Мне было интересно, можно ли создавать файлы cookie только для сеанса с помощью Javascript. Когда браузер закрыт, файлы cookie должны быть удалены.

Я не могу ничего использовать на сервере, поскольку веб-сайт является только HTML ... поэтому скрипт на стороне сервера не используется.

Я читал кое-что об этом здесь: http://blog.lysender.com/2011/08/setting-session-only-cookie-via-javascript/, но я не могу найти больше информации об этом ... так что я был интересно, надежен ли этот метод.

Ответы:


136

Да это верно.

Если не вставить expiresчасть, будет создан файл cookie сеанса, независимо от того, создается он в JavaScript или на сервере.

См. Https://stackoverflow.com/a/532660/1901857


У меня не работает и пробовал разными способами ... Может этот ответ устарел.
Дэн

Файлы cookie сеанса @Dan не работают, если в браузере включена конфигурация: «Продолжить с того места, где вы остановились». В этом случае браузеры не будут уничтожать файлы cookie сеанса после закрытия.
Тарон Сарибекян

@TaronSaribekyan, вы правы, но вы должны попросить всех пользователей вашего сайта отключить конфиг «Продолжить с того места, где вы остановились». Вместо этого sessionStorage сразу заработал во всех браузерах.
Дэн

50

В этом случае более простым решением было бы использовать sessionStorage:

var myVariable = "Hello World";

sessionStorage['myvariable'] = myVariable;

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

Однако имейте в виду, что sessionStorageвсе сохраняется в виде строки, поэтому при работе с массивами / объектами вы можете использовать JSON для их хранения:

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

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

Сеанс страницы длится до тех пор, пока открыт браузер, и выживает после перезагрузки и восстановления страницы. Открытие страницы в новой вкладке или окне вызовет запуск нового сеанса.

Итак, когда вы закрываете страницу / вкладку, данные теряются.


1
Да, Сессионное хранилище - лучший выбор для этого случая использования.
Жюльен Лафон

11
на самом деле теперь я использую хранилище сеанса ... но, видимо, когда вы открываете новую вкладку в chrome и firefox, вы не можете получить доступ к материалам, которые вы сохранили в хранилище сеанса ... поэтому я смотрел на файлы cookie сеанса: код. google.com/p/chromium/issues/detail?id=165452
Даан Порон

В этом случае файлы cookie должны быть надежными, хотя я понятия не имею, насколько хорошо они поддерживаются.
Cerbrus 07

2
Сессионное (и локальное) хранилище зависит от политики одинакового происхождения, поэтому, если вы переключитесь с http на https, у вас не будет доступа к материалам, хранящимся в http (и наоборот),
Джефф Лоури,

2
Я думаю, что SessionStorageпредоставляет client-onlyрешение только без доступа к этим значениям на стороне сервера. Во многих серверных фреймворках, таких как ASP.Net и PHP, мы хотели бы легко получить доступ к значениям на стороне клиента, которые мы могли сохранить, без использования скрытых полей и т. Д., И тогда файлы cookie станут лучшим решением, поскольку файлы cookie автоматически отправляются в на стороне сервера.
Sunil

9

Для создания cookie только сеанса с помощью java-скрипта вы можете использовать следующее. У меня это работает.

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

затем получите значение cookie следующим образом

 //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 "";
}

Хорошо, чтобы поддержать IE, мы можем оставить "expires" полностью и использовать это

document.cookie = "mtracker=somevalue; path=/";

4
expires = 0 в IE вообще не устанавливает cookie: blog.lysender.com/2011/08/…
JDandChips

1
expires = "" работает в IE и позволяет вам сбросить истечение срока действия cookie на Session, если вы явно установили его
koolunix

1

Используйте приведенный ниже код для файла cookie сеанса настройки, он будет работать до закрытия браузера. (убедитесь, что не закрываете вкладку)

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');
  }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.