java.lang.IllegalArgumentException: restricted header name: "Connection"
## 简介 从 `Java 11` 开始,Java 提供了新的 `HttpClient` 类来进行
渲染中...
## 简介
从 `Java 11` 开始,Java 提供了新的 `HttpClient` 类来进行 HTTP 请求。在 HttpClient 中,某些头部字段被视为受限制的头部字段,其中包括 "Connection" 头部字段。
当你尝试设置 "Connection" 头部字段时,会抛出 `IllegalArgumentException` 异常,提示该头部字段受限制。
<!-- more -->
## 解决
### 方式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")`END
评论
登录后查看和发表评论
前往登录