【问题标题】:Can I add a maximum expiry date to a session cookie?我可以为会话 cookie 添加最长到期日期吗?
【发布时间】:2018-09-04 17:58:25
【问题描述】:

我设置了一个session cookie,它没有任何到期日期,因此会在关闭浏览器时被删除。

现在我想添加一个最长有效期,这意味着

  • 如果浏览器在最大过期日期之前关闭,我的 cookie 将被删除
  • 否则我的 cookie 将在最长过期日期后被删除

请注意,我不想设置“常规”到期日期,因为这会使我的 cookie persistent 在到期日期之前关闭浏览器时无法删除。

我找到的唯一解决方案是拥有第二个持久性 cookie,具有最长到期日期:如果找不到第二个 cookie(过期),我手动删除我的第一个 cookie。由于我想在 cookie 中写入尽可能少的信息,如果有其他方式,我更愿意。

@CBroe 发表评论后,我补充说 cookie 是在客户端生成的,并且我没有关联的服务器端会话来存储上次访问时间戳

2018 年更新

在这个问题上开始赏金之后,我得到了几个答案。谢谢你。作为反馈,这可能更好地阐明我的问题的目的,请注意 我不是在寻找代码来设置持久性 cookie 或实施我已经拥有的解决方案(设置第二个持久性曲奇饼)。我希望有其他一些创造性的建议。目前,我可以使用 Zeeshan 的提示并在值中设置时间戳(我会将其附加到实际值中)。因此,该答案是迄今为止获得赏金的最佳人选。

【问题讨论】:

  • 你到底想通过这个实现什么? (我假设您不仅设置了客户端意义上的“会话 cookie”,而且还有与之关联的服务器端会话?在这种情况下,您应该将上次访问时间戳存储到会话中,然后下一个请求检查时差是否太大。)
  • @CBroe 我做网络分析。我没有服务器端会话。我确实有一个客户端意义上的会话 cookie,我正在根据该 cookie 按访问对浏览量进行分组,并希望有一个最长的访问持续时间
  • 那是你在处理数据时应该处理的事情。 // 特别是出于分析目的,您可能希望能够再次将我识别为同一用户,即使我关闭了浏览器,然后在几秒钟后再次打开您的网站——使用会话 cookie,这将是有问题的。因此,存储一个有效期更长的 cookie,并实现必要的逻辑,在后端按特定时间范围将页面视图“分组”在一起。
  • @CBroe 我已经有一个持久的访问者 cookie。如果您关闭浏览器并稍后再次打开该网站,我想计算 1 次访问者和 2 次访问。但随后很难中断长时间访问(有人数小时或数天不关闭浏览器)
  • “但是很难打破长时间的访问(有人不会关闭他们的浏览器数小时或数天)” – 再次,我会看看之间的间隔连续的要求。 // 你确定自己实现这个是有意义的吗?即使像谷歌分析公司这样的“大玩家”。出于隐私原因或其他原因,这些都是不可能的,仍然有诸如 Piwik 之类的开源解决方案,您可以在自己的系统上进行设置和运行。并且已经对这些工具如何最好地工作进行了很多思考 - 因此重新发明轮子可能不是这里最明智的选择。

标签: cookies


【解决方案1】:

如果您想将 cookie 保留为会话 cookie,您不能设置过期时间。 因此您可以将时间戳设置为 cookie 值,也可以创建新的 cookie 并将值设置为时间戳。

var timestamp = (new Date()).getTime()
document.cookie = "cookiename=value;  path=/";
document.cookie = "expirycookie="+timestamp+";  path=/";

对于仅客户端解决方案,您可以设置间隔来检查 cookie 时间戳值。 将以下代码添加到您的所有页面

   var interval = setInterval(function(){
         var timeStamp = getCookie('expirycookie') 
         if(!timeStamp){clearInterval(interval); return}
         var cookieDuration = 5*60*1000 //expire cookie after 5 min
         if(timeStamp < (new Date()).getTime() - cookieDuration){
           //cookie expired delete here
           document.cookie = 'cookiename=value; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
           document.cookie = 'expirycookie=value; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
          clearInterval(interval)
        }
      },1000)

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

【讨论】:

    【解决方案2】:

    Cookie::setMaxAge(int)

    在Java中我们必须指定一个过期时间,你可以使用javax.servlet.http.Cookie.setMaxAge(int)方法,它将cookie过期前的秒数作为参数。

    例如,对于五分钟到期,我们将执行以下操作:-

    // Create a new cookie for userID from a fictitious
    // method called getUserID
    Cookie cookie = new Cookie ("userID", getUserID());
    
    // Expire the cookie in five minutes (5 * 60)
    cookie.setMaxAge( 300 );
    

    当cookie被发送回浏览器时,使用HttpServletResponse.addCookie(Cookie),它只会被浏览器返回,直到到期日期到来。如果您愿意,您还可以为setMaxAge(int) 指定一个负值,并且一旦浏览器退出,cookie 就会过期。但是请注意,并不是每个人都会关闭他们的浏览器,它可能会在几分钟、几小时甚至几天内可用。最后,指定零值将立即使 cookie 过期。

    这是完整的 Java Servlet 示例。

    // Import required java libraries
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    // Extend HttpServlet class
    public class HelloForm extends HttpServlet {
    
       public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    
          // Create cookies for first and last names.      
          Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
          Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));
    
          // Set expiry date after 24 Hrs for both the cookies.
          firstName.setMaxAge(60*60*24);
          lastName.setMaxAge(60*60*24);
    
          // Add both the cookies in the response header.
          response.addCookie( firstName );
          response.addCookie( lastName );
    
          // Set response content type
          response.setContentType("text/html");
    
          PrintWriter out = response.getWriter();
          String title = "Setting Cookies Example";
          String docType =
             "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
    
          out.println(docType +
             "<html>\n" +
                "<head>
                   <title>" + title + "</title>
                </head>\n" +
    
                "<body bgcolor = \"#f0f0f0\">\n" +
                   "<h1 align = \"center\">" + title + "</h1>\n" +
                   "<ul>\n" +
                      "  <li><b>First Name</b>: "
                      + request.getParameter("first_name") + "\n" +
                      "  <li><b>Last Name</b>: "
                      + request.getParameter("last_name") + "\n" +
                   "</ul>\n" +
                "</body>
             </html>"
          );
       }
    }
    

    而 HtML 文件将是

    <html>
       <body>
          <form action = "HelloForm" method = "GET">
             First Name: <input type = "text" name = "first_name">
             <br />
             Last Name: <input type = "text" name = "last_name" />
             <input type = "submit" value = "Submit" />
          </form>
       </body>
    </html>
    

    【讨论】:

    • 您可以添加以下提示:您可以使用TimeUnit 枚举:myCookie.setMaxAge( TimeUnit.MINUTES.toSeconds( 5 ) ) ; // replaces 300 来使您的代码更具自我记录性,而不是像300 这样的硬编码“幻数”整数文字。 `
    • basil bourque 是的 100% 同意
    • 感谢您的回答。这里的问题是这是一个常规的持久cookie,并且在关闭并重新打开浏览器后(到期日期之前)它仍然存在,因此不满足我的要求
    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 2021-01-05
    • 2018-07-09
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多