You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配CHIPS:如何在Java 20中为所有Cookie设置Partitioned属性?

为Java 20应用的所有Cookie添加CHIPS Partitioned属性的方案

由于Java 20的Cookie类未提供原生的setPartitioned方法,你可以通过以下两种便捷方式统一为所有Cookie添加Partitioned属性,适配CHIPS标准:

1. 手动构造Cookie响应头(原生Servlet场景)

直接绕过Cookie对象的addCookie方法,使用HttpServletResponse的addHeader/setHeader方法手动拼接包含Partitioned;的Cookie字符串:

// 构造完整的Cookie字符串,包含必要属性及Partitioned
String cookieStr = "sessionId=abc123; Path=/; Secure; HttpOnly; Partitioned;";
response.addHeader("Set-Cookie", cookieStr);

注意:CHIPS要求Cookie必须标记为Secure,生产环境务必包含该属性(本地HTTP开发可临时省略,但上线前必须启用HTTPS并添加Secure)。

2. 全局过滤器统一修改(框架场景,如Spring Boot)

通过自定义过滤器拦截所有响应,自动为所有Set-Cookie头添加Partitioned;属性,无需逐个修改Cookie生成逻辑:

自定义过滤器实现

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;

public class PartitionedCookieFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResp = (HttpServletResponse) response;
        HttpServletResponseWrapper wrappedResp = new HttpServletResponseWrapper(httpResp) {
            @Override
            public void addHeader(String name, String value) {
                updateCookieHeader(name, value, super::addHeader);
            }

            @Override
            public void setHeader(String name, String value) {
                updateCookieHeader(name, value, super::setHeader);
            }

            private void updateCookieHeader(String name, String value, HeaderSetter setter) {
                if ("Set-Cookie".equalsIgnoreCase(name)) {
                    // 仅给未包含Partitioned的Cookie添加属性,同时确保Secure存在
                    StringBuilder updatedValue = new StringBuilder(value);
                    if (!value.contains("Partitioned;")) {
                        if (!value.contains("Secure;")) {
                            updatedValue.append("; Secure");
                        }
                        updatedValue.append("; Partitioned;");
                    }
                    setter.accept(name, updatedValue.toString());
                } else {
                    setter.accept(name, value);
                }
            }

            @FunctionalInterface
            private interface HeaderSetter {
                void accept(String name, String value);
            }
        };
        chain.doFilter(request, wrappedResp);
    }
}

在Spring Boot中注册过滤器

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<PartitionedCookieFilter> partitionedCookieFilter() {
        FilterRegistrationBean<PartitionedCookieFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new PartitionedCookieFilter());
        registrationBean.addUrlPatterns("/*"); // 对所有请求路径生效
        return registrationBean;
    }
}

额外注意事项

  • 若使用第三方Cookie生成组件(如Spring Session),过滤器方式可以统一覆盖处理,无需修改组件内部逻辑。
  • Java 21及后续版本可能会在Cookie类中新增原生的Partitioned属性支持,届时可切换为原生API简化实现。

内容的提问来源于stack exchange,提问作者DiegoP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:08:10