HttpHeaders

HttpHeaders 是用于存储和操作HTTP请求或响应头部字段的接口。

// DefaultHttpHeaders, HttpHeadersFactory.TrailingHttpHeaders 
public interface HttpHeaders extends Iterable<Entry<CharSequence, CharSequence>> {static HttpHeaders emptyHeaders() {return newHeaders(2, true, true, true);}static HttpHeaders newHeaders() {return newHeaders(true);}static HttpHeaders newHeaders(boolean validate) {return newHeaders(16, validate, validate, validate);}static HttpHeaders newHeaders(int sizeHint, boolean checkNames, boolean checkCookies, boolean checkValues) {return new DefaultHttpHeaders(sizeHint, checkNames, checkCookies, checkValues);}HttpHeaders copy();@NullableCharSequence get(CharSequence name);default CharSequence get(final CharSequence name, final CharSequence defaultValue) {final CharSequence value = get(name);return value != null ? value : defaultValue;}@NullableCharSequence getAndRemove(CharSequence name);default CharSequence getAndRemove(final CharSequence name, final CharSequence defaultValue) {final CharSequence value = getAndRemove(name);return value == null ? defaultValue : value;}Iterator<CharSequence> valuesIterator(CharSequence name);default Iterable<CharSequence> values(CharSequence name) {return () -> (Iterator<CharSequence>) valuesIterator(name);}default boolean contains(final CharSequence name) {return get(name) != null;}default boolean contains(CharSequence name, CharSequence value) {return AsciiString.contentEquals(get(name), value);}default boolean containsIgnoreCase(CharSequence name, CharSequence value) {return AsciiString.contentEqualsIgnoreCase(get(name), value);}int size();default boolean isEmpty() {return size() == 0;}Set<CharSequence> names();HttpHeaders add(CharSequence name, CharSequence value);HttpHeaders add(CharSequence name, Iterable<? extends CharSequence> values);default HttpHeaders add(CharSequence name, Iterator<? extends CharSequence> valuesItr) {while (valuesItr.hasNext()) {add(name, valuesItr.next());}return this;}HttpHeaders add(CharSequence name, CharSequence... values);HttpHeaders add(HttpHeaders headers);HttpHeaders set(CharSequence name, CharSequence value);HttpHeaders set(CharSequence name, Iterable<? extends CharSequence> values);default HttpHeaders set(CharSequence name, Iterator<? extends CharSequence> valueItr) {remove(name);while (valueItr.hasNext()) {add(name, valueItr.next());}return this;}default HttpHeaders set(CharSequence name, CharSequence... values) {remove(name);for (CharSequence value : values) {add(name, value);}return this;}default HttpHeaders set(final HttpHeaders headers) {if (headers != this) {clear();add(headers);}return this;}default HttpHeaders replace(final HttpHeaders headers) {if (headers != this) {for (final CharSequence key : headers.names()) {remove(key);}add(headers);}return this;}boolean remove(CharSequence name);boolean remove(CharSequence name, CharSequence value);boolean removeIgnoreCase(CharSequence name, CharSequence value);HttpHeaders clear();@OverrideIterator<Entry<CharSequence, CharSequence>> iterator();@Overridedefault Spliterator<Entry<CharSequence, CharSequence>> spliterator() {return Spliterators.spliterator(iterator(), size(), Spliterator.SIZED);}@OverrideString toString();default String toString(BiFunction<? super CharSequence, ? super CharSequence, CharSequence> filter) {return HeaderUtils.toString(this, filter);}@NullableHttpCookiePair getCookie(CharSequence name);@NullableHttpSetCookie getSetCookie(CharSequence name);default Iterable<HttpCookiePair> getCookies() {return () -> (Iterator<HttpCookiePair>) getCookiesIterator();}Iterator<HttpCookiePair> getCookiesIterator();default Iterable<HttpCookiePair> getCookies(CharSequence name) {return () -> (Iterator<HttpCookiePair>) getCookiesIterator(name);}Iterator<HttpCookiePair> getCookiesIterator(CharSequence name);default Iterable<HttpSetCookie> getSetCookies() {return () -> (Iterator<HttpSetCookie>) getSetCookiesIterator();}Iterator<HttpSetCookie> getSetCookiesIterator();default Iterable<HttpSetCookie> getSetCookies(CharSequence name) {return () -> (Iterator<HttpSetCookie>) getSetCookiesIterator(name);}Iterator<HttpSetCookie> getSetCookiesIterator(CharSequence name);default Iterable<HttpSetCookie> getSetCookies(CharSequence name, CharSequence domain, CharSequence path) {return () -> (Iterator<HttpSetCookie>) getSetCookiesIterator(name, domain, path);}Iterator<HttpSetCookie> getSetCookiesIterator(CharSequence name, CharSequence domain, CharSequence path);HttpHeaders addCookie(HttpCookiePair cookie);default HttpHeaders addCookie(final CharSequence name, final CharSequence value) {return addCookie(new DefaultHttpCookiePair(name, value));}HttpHeaders addSetCookie(HttpSetCookie cookie);default HttpHeaders addSetCookie(final CharSequence name, final CharSequence value) {return addSetCookie(new DefaultHttpSetCookie(name, value));}boolean removeCookies(CharSequence name);boolean removeSetCookies(CharSequence name);boolean removeSetCookies(CharSequence name, CharSequence domain, CharSequence path);
}

HttpCookiePair

HttpCookiePair 接口定义了 HTTP Cookie 键值对的结构,包括名称、值、是否被双引号包裹及其编码表示, 格式如下:

  1. <cookie-name>=<cookie-value>
  2. <cookie-name>=“<cookie-value>”
// DefaultHttpCookiePair
public interface HttpCookiePair {CharSequence name();CharSequence value();boolean isWrapped();CharSequence encodedCookie();
}

HttpSetCookie

HttpSetCookie 接口扩展了 HttpCookiePair,表示一个完整的 Set-Cookie,包含域、路径、生命周期、安全属性、SameSite 策略等信息,支持编码与过期计算。

Set-Cookie HTTP 头的格式大致如下:

Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>; Max-Age=<seconds>; Domain=<domain>; Path=<path>; Secure; HttpOnly; SameSite=<Lax|Strict|None>; Partitioned
字段名是否必填值类型说明
name=value字符串Cookie 的名称和值,必须出现在首位。value 可包含特殊字符,建议进行 URL 编码。
Expires=<date>GMT 日期字符串设定 Cookie 的过期时间,格式如 Wed, 09 Jun 2027 10:18:14 GMT。过期即被删除。
Max-Age=<秒数>整数(秒)设置 Cookie 的生存时间(从当前起多少秒),优先级高于 Expires
Domain=<domain>字符串指定 Cookie 可被哪些域访问,默认是当前域,不带子域;设置 .example.com 可包括子域。
Path=<path>字符串指定 Cookie 生效的路径,默认是当前路径及其子路径。常用 / 表示全站有效。
Secure无值表示仅在 HTTPS 连接中发送该 Cookie,保障传输安全。
HttpOnly无值禁止通过 JavaScript 访问该 Cookie,可防范 XSS 攻击。
SameSiteLax | Strict | None控制是否允许跨站点请求携带该 Cookie。
Strict: 严格禁止跨站请求
Lax: 允许部分(如 GET 跳转)
None: 允许全部,需配合 Secure
Partitioned无值指示该 Cookie 为分区 Cookie(Partitioned Cookie)。必须与 SecureSameSite=None 一起使用,仅部分浏览器支持。
// DefaultHttpSetCookie
public interface HttpSetCookie extends HttpCookiePair {@NullableCharSequence domain();@NullableCharSequence path();@NullableLong maxAge();@NullableCharSequence expires();@Nullabledefault Long expiresAsMaxAge() {CharSequence expires = expires();if (expires != null) {Date expiresDate = DateFormatter.parseHttpDate(expires);if (expiresDate != null) {long maxAgeMillis = expiresDate.getTime() - System.currentTimeMillis();return maxAgeMillis / 1000 + (maxAgeMillis % 1000 != 0 ? 1 : 0);}}return null;}@NullableSameSite sameSite();boolean isSecure();boolean isHttpOnly();CharSequence encodedSetCookie();enum SameSite {Lax, Strict, None}boolean isPartitioned();
}

HttpHeadersFactory

HttpHeadersFactory 是用于创建和配置 HTTP 头部对象及其校验行为的工厂接口。

// DefaultHttpHeadersFactory
public interface HttpHeadersFactory {HttpHeaders newHeaders();HttpHeaders newEmptyHeaders();int getSizeHint();boolean isValidatingNames();boolean isValidatingValues();boolean isValidatingCookies();
}

public final class DefaultHttpHeadersFactory implements HttpHeadersFactory {private static final int SIZE_HINT = 16;private static final DefaultHttpHeadersFactory FOR_HEADER =new DefaultHttpHeadersFactory(SIZE_HINT, true, true, true, false);private static final DefaultHttpHeadersFactory FOR_TRAILER =new DefaultHttpHeadersFactory(SIZE_HINT, true, true, true, true);private static final int MIN_SIZE_HINT = 2;// 用于提示内部数据结构(通常是哈希表)应该多大。private final int sizeHint;// 是否开启 HTTP 头名称的合法性校验(比如是否符合 RFC 规定的字符集等)。private final boolean validateNames;// 是否开启 HTTP 头的值的合法性校验。private final boolean validateValues;// 是否在解析 Cookie 时对 Cookie 内容做合法性校验(如格式、字符等)。private final boolean validateCookies;// 是否以“尾部头”(trailer header)专用的规则进行名称校验。private final boolean validateAsTrailer;private DefaultHttpHeadersFactory(int sizeHint, boolean validateNames, boolean validateValues, boolean validateCookies, boolean validateAsTrailer) {this.sizeHint = Math.max(MIN_SIZE_HINT, sizeHint); this.validateNames = validateNames;this.validateValues = validateValues;this.validateCookies = validateCookies;this.validateAsTrailer = validateAsTrailer;}public static DefaultHttpHeadersFactory headersFactory() {return FOR_HEADER;}public static DefaultHttpHeadersFactory trailersFactory() {return FOR_TRAILER;}@Overridepublic HttpHeaders newHeaders() {if (validateAsTrailer) {return new TrailingHttpHeaders(sizeHint, validateNames, validateCookies, validateValues);}return HttpHeaders.newHeaders(sizeHint, validateNames, validateCookies, validateValues);}@Overridepublic HttpHeaders newEmptyHeaders() {if (validateAsTrailer) {return new TrailingHttpHeaders(MIN_SIZE_HINT, validateNames, validateCookies, validateValues);}return HttpHeaders.newHeaders(MIN_SIZE_HINT, validateNames, validateCookies, validateValues);}// ...private static final class TrailingHttpHeaders extends DefaultHttpHeaders {TrailingHttpHeaders(int arraySizeHint, boolean validateNames, boolean validateCookies, boolean validateValues) {super(arraySizeHint, validateNames, validateCookies, validateValues);}// 该类用于处理 HTTP 的 trailing headers —— 即 chunked 编码中的最后一块 trailer 部分。// RFC 7230 明确禁止 trailing headers 不能包含某些首部字段,如:Content-Length, Transfer-Encoding, Trailer@Overrideprotected CharSequence validateKey(@Nullable CharSequence name, boolean forAdd) {if (HttpHeaderNames.CONTENT_LENGTH.contentEqualsIgnoreCase(name)|| HttpHeaderNames.TRANSFER_ENCODING.contentEqualsIgnoreCase(name)|| HttpHeaderNames.TRAILER.contentEqualsIgnoreCase(name)) {throw new IllegalArgumentException("Prohibited trailing header: " + name);}return super.validateKey(name, forAdd);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87828.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87828.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87828.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Flink 1.20、StarRocks与TiCDC构建高效数据处理链路教程

在大数据处理领域&#xff0c;实现高效、实时的数据处理与分析至关重要。Flink作为强大的流批一体化计算框架&#xff0c;结合StarRocks这一高性能的实时分析型数据库&#xff0c;再搭配TiCDC&#xff08;TiDB Change Data Capture&#xff09;用于捕获数据变更&#xff0c;能够…

便捷的Office批量转PDF工具

软件介绍 本文介绍的软件是一款能实现Office批量转换的工具&#xff0c;名为五五Excel word批量转PDF。 软件小巧 这款五五Excel word批量转PDF软件大小不到2M。 操作步骤一 使用该软件时&#xff0c;只需把软件和需要转换的Word或Excel文件放在同一个文件夹里。 操作步骤…

tcp长连接与短连接

TCP连接本身是一个传输层协议&#xff0c;它既可以实现长连接&#xff0c;也可以实现短连接。这取决于应用层的使用方式。 短连接&#xff08;Short Connection&#xff09; 特点&#xff1a;每次请求都建立新的TCP连接&#xff0c;完成后立即关闭流程&#xff1a;建立连接 →…

llvm polly,亲自测试

1&#xff09;下载并安装 Polly - Getting Started git clone https://github.com/llvm/llvm-project.git 大概需要半个小时&#xff0c;有时候被墙掉就打不开 2&#xff09; mkdir build && cd build cmake -DLLVM_ENABLE_PROJECTSclang;polly ../llvm cmake --b…

Spring AI 项目实战(十四):Spring Boot + Vue3 +AI + DeepSeek 实现空气质量智能预测系统(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4

腾讯云 CDN 不支持 WebSocket 的现状与华为云 CDN 的替代方案-优雅草卓伊凡

腾讯云 CDN 不支持 WebSocket 的现状与华为云 CDN 的替代方案-优雅草卓伊凡 问题背景 卓伊凡今天发现&#xff0c;腾讯云 CDN 不支持 WebSocket 协议&#xff0c;而公司的部分业务&#xff08;如实时聊天、在线协作、游戏互动、股票行情推送等&#xff09;依赖长连接通信。昨…

MybatisPlus(一)扩展功能

扩展功能 一、静态工具二、逻辑删除三、通用枚举1、定义枚举2、配置枚举处理器3、测试 四、JSON类型处理器1、定义实体2、使用类型处理器 五、分页1、配置分页插件2、分页API3、示例 一、静态工具 有的时候Service之间也会相互调用&#xff0c;为了避免出现循环依赖问题&#…

Redis哨兵模式之Sentinel模式(二)

一、多节点哨兵如何配置&#xff1f; 哨兵配置原理图 注意&#xff1a;sentinel哨兵模式的搭建是建立在redis主从复制节点配置基础而搭建&#xff0c;在主从配置中从库需要配置好replicaof关联上主库并关闭安全模式&#xff0c;然后设置好bind端口才能关联上机器&#xff0c;而…

基于Excel的数据分析思维与分析方法

数据分析一定要会Excel、SQL和Python&#xff1f;非常肯定地回答您&#xff0c;Python、R语言、Excel函数和VBA&#xff0c;以及高级数据分析软件&#xff0c;都学不到&#xff0c;您将学到&#xff1a;5个有效的数据分析利器&#xff0c;以及分析思维 一、描述性统计分析 在…

计算机网络笔记(不全)

一、计算机网络体系结构1.计算机网络的概念计算机网络&#xff1a;由若干结点和连接这些结点的链路组成。结点可以是计算机、集线器、交换机、路由器等。互连网(internet)&#xff1a;多个计算机网络通过路由器互相连接而成&#xff0c;可用任意协议通信。互联网(因特网Interne…

XML Schema 复合元素

XML Schema 复合元素 引言 XML(可扩展标记语言)作为一种灵活的标记语言,广泛应用于数据交换和存储。XML Schema 是一种用于描述和定义 XML 文档结构的语言,它定义了 XML 文档的元素、属性、类型和约束。本文将详细介绍 XML Schema 中的复合元素,并探讨其在实际应用中的重…

华为云Flexus+DeepSeek征文 | 弹性算力实战:Flexus X实例自动扩缩容策略优化

华为云FlexusDeepSeek征文 | 弹性算力实战&#xff1a;Flexus X实例自动扩缩容策略优化 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者…

【仓颉】运行环境配置VSCode + Win11

作者&#xff1a;大李子 团队&#xff1a;坚果派 十年iOS&#xff0c;All in转鸿蒙 前言 “仓颉编程语言是一款面向全场景智能的新一代编程语言&#xff0c;主打原生智能化、天生全场景、高性能、强安全。融入鸿蒙生态&#xff0c;为开发者提供良好的编程体验。” ——摘自仓…

【K线训练软件研发历程】【日常记录向】1.K线滑动窗口

文章目录 当前效果未来发展思路技术选型值得分享的技术点数据加载、解析的代码echats的代码当前效果 👆相当于有个hello world了。 未来发展思路 开源 技术选型 界面直接采用electron,等开源后,可以直接挂release,用户下载安装包后,一键安装,一键运行,降低使用门槛…

抖音解析下载工具 v1.0.0:免安装单文件,一键无水印保存高清视音频

宝子们&#xff0c;今天给你们带来一款超轻量的抖音下载神器——抖音解析下载工具 v1.0.0。 它只有单文件&#xff0c;双击就能用&#xff0c;免安装、无广告、完全免费&#xff0c;复制粘贴链接即可一键解析下载高清无水印视频/音频&#xff0c;简直不要太方便&#xff01; 为…

Ingress——2

目录 ‌一. 域名重定向&#xff08;HTTP→HTTPS/旧域名跳转&#xff09;‌ ‌二. 前后端分离Rewrite&#xff08;路径改写&#xff09;‌ ‌三. 混合配置示例&#xff08;重定向Rewrite&#xff09;‌ ‌四. SSL/TLS配置&#xff08;HTTPS加密&#xff09;‌ ‌五. 基本认…

12. grafana-Dashboard的Variable(过滤)使用

说明制作这样一个选择过滤的下拉框&#xff0c;可以选择某个服务器的步骤1. 点击最上面的Dashboard settings2. 选择Variables 并点击ADD variable3. 写出过滤的标签名和查询条件&#xff08;label_values(查询条件)&#xff09;4. 点击 save as... 保存退出5. 出来后左上角就…

Cursor一键续杯pro教程,支持最新1.0系列版本

使用前检查&#xff1a; 使用前请先看左下角&#xff0c;是否获取到Cursor的版本号 如果没有请先在 功能页面 -→ 自定义Cursor路径 选择你Cursor的安装的路径&#xff0c;并开启后重启YCursor&#xff0c;获取到版本后才能正常使用功能 检查软件左下角的权限标识是否为绿色 如…

pyhton基础【25】面向对象进阶六

目录 十七.单例模式 实现单例模式的两种方式 __new__方法概述 单例模式的使用场景 十七.单例模式 引入 单例模式是一种常用的软件设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。 实现单例模式的两种方式 使用类属性创…

后端树形结构

案例 在后端开发中&#xff0c;树形结构数据的查询和处理是一个常见的需求&#xff0c;比如部门管理、分类目录展示等场景。接下来&#xff0c;我们以一个部门管理系统为例&#xff0c;详细介绍如何实现后端的树查询功能。 案例背景 假设我们正在开发一个公司的内部管理系统&am…