2023-06-05
温故知新
00
请注意,本文编写于 417 天前,最后修改于 201 天前,其中某些信息可能已经过时。

目录

简介
解决
方式1
方式2
详解

简介

Java 11 开始,Java 提供了新的 HttpClient 类来进行 HTTP 请求。在 HttpClient 中,某些头部字段被视为受限制的头部字段,其中包括 "Connection" 头部字段。

当你尝试设置 "Connection" 头部字段时,会抛出 IllegalArgumentException 异常,提示该头部字段受限制。

解决

方式1

  • 不要设置Connection请求头。

那肯定不行啊!所以请看方式2

方式2

  • 放弃JDK原生的HttpClient吧!

我选择的替代方案是okhttp

  • gradle:
chrovy
implementation("com.squareup.okhttp3:okhttp:4.9.1")
  • maven:
xml
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency>

详解

我查看Java17源码中,底层禁止设置的请求头(header)有"connection", "content-length", "expect", "host", "upgrade" ,而且没有找到能跳过校验的方式。

  • 校验请求头的代码:
java
private void checkNameAndValue(String name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); if (!isValidName(name)) { throw newIAE("invalid header name: \"%s\"", name); } if (!Utils.ALLOWED_HEADERS.test(name, null)) { throw newIAE("restricted header name: \"%s\"", name); } if (!isValidValue(value)) { throw newIAE("invalid header value: \"%s\"", value); } }

其中ALLOWED_HEADERS校验的header默认有("connection", "content-length", "expect", "host", "upgrade")

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!