使 Cookie 标头中的字符串过期

2022-09-03 16:29:38

我想这个问题很简单,但我似乎找不到答案。

我正在Java Servlet中用Cookie类编写一个cookie,该类在响应标头中发送到浏览器,如下所示:

Set-Cookie: test=somevalue; Domain=.mydomain.org; Expires=Thu, 06-Jan-2011 18:45:20 GMT; Path=/

我正在通过Servlet 2.5 API中的Cookie类来执行此操作。我需要将“HTTPOnly”添加到此字符串的末尾,这是Servlet 2.5 API不支持的。没问题,我只是手动创建字符串并将“HTTPOnly”附加到末尾...

但是,在这样做时,我遇到的挑战是,首先要在那里设置“Expires”标头,我使用了.setMaxAge(3600),它创建了该字符串的“Expires”部分。但是,由于我无法使用Cookie类,因此我需要创建该“Expires”部分的值。

那么基本上,如何将“3600”格式化为“星期四,06-Jan-2011 18:45:20 GMT”?

注意:我可能会用DateFormat找出正确的模式,但我希望有更好的方法来做到这一点。另一个想法:像以前一样使用Cookie类,然后只需以编程方式将Cookie转换为相应的标头字符串,然后只需将“HTTPOnly”附加到末尾即可。但是我不知道有任何方法可以获取Cookie对象并将其转换为相应的字符串值。

那么,在可选的情况下,我如何获取Cookie对象并以编程方式将其转换为相应的String值?

谢谢!


答案 1

像这样:

Date expdate = new Date ();
expdate.setTime (expdate.getTime() + (3600 * 1000));
String cookieExpire = "expires=" + expdate.toGMTString();
...

..并且由于 toGMTString() 已被弃用

Date expdate= new Date();
expdate.setTime (expdate.getTime() + (3600 * 1000));
DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", java.util.Locale.US);
df.setTimeZone(TimeZone.getTimeZone("GMT"));
String cookieExpire = "expires=" + df.format(expdate);

答案 2

Java 8 现在提供了适当的日期格式化程序,DateTimeFormatter.RFC_1123_DATE_TIME

OffsetDateTime oneHourFromNow 
        = OffsetDateTime.now(ZoneOffset.UTC)
        .plus(Duration.ofHours(1));

String cookieExpires 
        = DateTimeFormatter.RFC_1123_DATE_TIME
        .format(oneHourFromNow);

// E.g. "Tue, 8 Nov 2016 20:15:46 GMT"

此格式对属性有效,请参阅 RFC 6265 § 4.1.1,其中将格式定义为 RFC 1123 日期:expires

expires-av        = "Expires=" sane-cookie-date
sane-cookie-date  = <rfc1123-date, defined in [RFC2616], Section 3.3.1>

推荐