Cookie的过期时间如何设定的呢?

本文探讨了在Java开发中如何设置Cookie的过期时间,通过分析HttpServletResponse的子类Rfc6265CookieProcessor和LegacyCookieProcessor的实现,揭示了Tomcat在处理Cookie过期时间时会转换为GMT零时区。开发者需要注意根据时区调整setMaxAge(seconds)的参数,以确保正确设置过期时间。

在实际的开发工作中,需要在多次请求中携带一些带有生命期的数据信息,以及需要和前端协作存储少量含有过期值的必须数据。那么就需要使用到cookie了,有了cookie大家可能会想到,session也可以完成会话时数据的存储呀。他们确实都可以,只是用法,范围以及场景都略有却别!

cookie的过期时间如何设置的呢,很简单掉用setMaxAge(seconds)即可,再通过httpServletResponse.addCookie(cookie)完成cookie的种植即可。虽然只是简单的两步,如果没了解过期值设置的原理,依然后存在问题。cookie在过期时间(自己认为的)内失效,cookie设置的过期值无效,导致获取时不存在

接下来,通过源码分析如何设置的cookie过期值,又如何在response的headers中设置Set-cookie头。
httpServletResponse作为父接口,所以我们需要看它的子类(子类有很多)

org.apache.catalina.connector.Response#addCookie(cookie)方法:
public void addCookie(final Cookie cookie) {

    // Ignore any call from an included servlet
    if (included || isCommitted()) {
        return;
    }

    cookies.add(cookie);

    String header = generateCookieString(cookie);
    //if we reached here, no exception, cookie is valid
    // the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
    // RFC2965 is not supported by browsers and the Servlet spec
    // asks for 2109.
    addHeader("Set-Cookie", header, getContext().getCookieProcessor().getCharset());
}

// 生成cookie字符串。
public String generateCookieString(final Cookie cookie) {
    // Web application code can receive a IllegalArgumentException
    // from the generateHeader() invocation
    if (SecurityUtil.isPackageProtectionEnabled()) {
        return AccessController.doPrivileged(new PrivilegedAction<String>() {
            @Override
            public String run(){
                return getContext().getCookieProcessor().generateHeader(cookie);
            }
        });
    } else {
        return getContext().getCookieProcessor().generateHeader(cookie);
    }
}

这里的getContext().getCookieProcessor()有两个不同的CookieProcessor实现类分别如下:

  • org.apache.tomcat.util.http.Rfc6265CookieProcessor
    在这里插入图片描述
  • org.apache.tomcat.util.http.LegacyCookieProcessor
    在这里插入图片描述
    response中的Set-cookie头是通过CookieProcessor的generateHeader(cookie)实现的,Rfc6265CookieProcessor与LegacyCookieProcessor的实现大致相同。
    LegacyCookieProcessor对response中cookie过期值的渲染逻辑如下:
    在这里插入图片描述
    Rfc6265CookieProcessor对response中cookie过期值的渲染逻辑如下:
    在这里插入图片描述

可以看到,在渲染过期时间时,都有ANCIENT_DATECOOKIE_DATE_FORMAT属性,其实他们都来自Rfc6265CookieProcessor与LegacyCookieProcessor的基类org.apache.tomcat.util.http.CookieProcessorBase,代码如下:

public abstract class CookieProcessorBase implements CookieProcessor {

    private static final String COOKIE_DATE_PATTERN = "EEE, dd-MMM-yyyy HH:mm:ss z";

    protected static final ThreadLocal<DateFormat> COOKIE_DATE_FORMAT =
        new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            DateFormat df =
                new SimpleDateFormat(COOKIE_DATE_PATTERN, Locale.US);
            df.setTimeZone(TimeZone.getTimeZone("GMT"));
            return df;
        }
    };

    protected static final String ANCIENT_DATE;

    static {
        ANCIENT_DATE = COOKIE_DATE_FORMAT.get().format(new Date(10000));
    }
}

通过TimeZone.getTimeZone(“GMT”),可以看出来,tomcat在处理cookie过期时间时,都是转换为GTM零时区来返回该过期时间的数据,我们则需要依据自己的时区特性,在执行setMaxAge(seconds)时,完成时间的偏移(例如过期时间为5min,那么这里的seconds参数需要设置为5min + 8h,才是东八区(GTM+8)当前时间点之后的5min)。以上便是对cookie过期时间设置的简单摸索。

在Web开发中,cookie是一种用于存储用户信息的机制。通过设置cookie的存活时间,可以控制cookie在客户端浏览器中的存储时长。cookie的存活时间可以通过设置`Expires`或`Max-Age`属性来实现。 1. **Expires**:指定cookie过期时间,格式为GMT格式的日期字符串。如果不设置`Expires`或`Max-Age`,cookie将在浏览器会话结束时失效。 2. **Max-Age**:指定cookie有效期,以秒为单位。如果同时设置了`Expires`和`Max-Age`,`Max-Age`的优先级更高。 以下是一个设置cookie存活时间的示例代码: ```javascript // 使用JavaScript设置cookie function setCookie(name, value, days) { let expires = ""; if (days) { const date = new Date(); date.setTime(date.getTime() + (days*24*60*60*1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + (value || "") + expires + "; path=/"; } // 设置一个有效期为7天的cookie setCookie("username", "JohnDoe", 7); ``` ```python # 使用Python的Flask框架设置cookie from flask import Flask, make_response app = Flask(__name__) @app.route('/set_cookie') def set_cookie(): resp = make_response("Setting a cookie") resp.set_cookie('username', 'JohnDoe', max_age=7*24*60*60) # 设置有效期为7天 return resp ``` ```php // 使用PHP设置cookie <?php // 设置一个有效期为7天的cookie $name = "username"; $value = "JohnDoe"; $expire = time() + 7*24*60*60; // 当前时间加上7天的秒数 setcookie($name, $value, $expire, "/"); ?> ``` 通过以上方法,可以根据需要设置cookie的存活时间,以便在客户端浏览器中持久化存储用户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值