我设置了一个session cookie,它没有任何到期日,因此在浏览器关闭时会被删除。
现在我想添加一个最长的到期日期,这意味着
请注意,我不想设置“常规”到期日期,因为这会使我的cookie persistent在浏览器在到期日之前关闭时无法删除。
我找到的唯一解决方案是拥有第二个持久性cookie,其中包含最大到期日期:如果找不到第二个cookie(过期),我会手动删除我的第一个cookie。由于我想在cookie中尽可能少地写信息,我更愿意,如果有另一种方式。
在@ CBroe的评论之后,我补充说,cookie是在客户端生成的,我没有关联的服务器端会话,在那里存储最后一个访问时间戳
2018更新
在这个问题上开始赏金之后,我得到了几个答案。谢谢。作为反馈,可能更好地澄清我的问题的目的,请注意我不是在寻找代码来设置持久性cookie或实现我已经拥有的解决方案(设置第二个持久性曲奇饼)。我希望得到一些其他的创意建议。目前,我可以使用Zeeshan的提示并在值中设置时间戳(我会将其附加到实际值)。因此,答案是迄今为止获得赏金的最佳候选人。
答案 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 "";
}