【问题标题】:Session only cookies with Javascript仅使用 Javascript 的会话 cookie
【发布时间】:2012-12-21 05:23:50
【问题描述】:

我想知道是否可以使用 Javascript 创建仅会话 cookie。当浏览器关闭时,cookies 应该被删除。

我不能在服务器上使用任何东西,因为网站只是 HTML ......所以没有使用服务器端脚本。

我在这里读到了一些关于此的内容: http://blog.lysender.com/2011/08/setting-session-only-cookie-via-javascript/ 但是我找不到更多关于这个的信息......所以我想知道这种方法是否可靠。

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    是的,没错。

    不添加expires 部分将创建一个会话cookie,无论它是在JavaScript 中还是在服务器上创建的。

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

    【讨论】:

    • 它对我不起作用并尝试了多种方式......也许这个答案已经过时了。
    • @Dan 会话 cookie 在启用配置的情况下不起作用:浏览器中的“从上次中断的地方继续”。在这种情况下,浏览器在关闭后不会销毁会话 cookie。
    • @TaronSaribekyan 你是对的,但你必须要求你网站的所有用户禁用配置“从你离开的地方继续”。相反 sessionStorage 在所有浏览器中都可以立即使用。
    【解决方案2】:

    一个更简单的解决方案是使用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']);
    

    只要浏览器处于打开状态,页面会话就会持续,并且在页面重新加载和恢复后仍然存在。在新选项卡或窗口中打开页面将导致启动新会话。

    因此,当您关闭页面/选项卡时,数据会丢失。

    【讨论】:

    • 是的,会话存储是这个用例的最佳选择。
    • 实际上我现在正在使用会话存储...但显然当您在 chrome 和 firefox 中打开一个新选项卡时,您无法访问存储在会话存储中的内容...这就是为什么我正在查看会话 cookie:code.google.com/p/chromium/issues/detail?id=165452
    • 在这种情况下,cookie 应该是可靠的,虽然我不知道它们的支持程度。
    • 会话(和本地)存储受到同源策略的影响,因此如果您从 http 切换到 https,则无法访问存储在 http 中的内容(反之亦然)
    • 我认为SessionStorage 仅提供client-only 解决方案,而无法在服务器端访问这些值。在许多服务器端框架(如 ASP.Net 和 PHP)中,我们希望在不使用隐藏字段等的情况下轻松访问我们可能存储的客户端值,然后 cookie 成为更好的解决方案,因为 cookie 会自动发送到服务器端。
    【解决方案3】:

    要使用 java 脚本创建仅会话 cookie,您可以使用以下内容。这对我有用。

    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我们可以完全离开“过期”并且可以使用这个

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

    【讨论】:

    • IE 中的 expires=0 根本没有设置 cookie:blog.lysender.com/2011/08/…
    • expires="" 在 IE 中工作,如果您已明确设置,则允许您将 cookie 的到期时间重置为会话
    【解决方案4】:

    使用以下代码设置会话 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
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2014-09-02
    • 2012-02-26
    • 1970-01-01
    • 2022-06-17
    • 2013-07-06
    • 2011-09-07
    相关资源
    最近更新 更多