我可以在会话cookie中添加最长到期日期吗?

时间:2016-02-03 14:22:40

标签: cookies

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

现在我想添加一个最长的到期日期,这意味着

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

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

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

在@ CBroe的评论之后,我补充说,cookie是在客户端生成的,我没有关联的服务器端会话,在那里存储最后一个访问时间戳

2018更新

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

2 个答案:

答案 0 :(得分:0)

Cookie::setMaxAge(int)

在Java中,我们必须指定一个到期时间,可以使用javax.servlet.http.Cookie.的{​​{3}}方法作为参数,该参数将决定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 );

使用HttpServletResponse.addCookie(Cookie)将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>

答案 1 :(得分:0)

如果您想将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 "";
}