2023-06-05
温故知新
00

目录

简介
解决
方式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 许可协议。转载请注明出处!