Java 11 引入了更为人性化的 httpClient api 以取代 原生 URLConnection 以及 apache 所提供的 httpClient,但使用(破啊重)时发现某些请求头做了安全限制,如下请求,会抛出 java.lang.IllegalArgumentException: restricted header name: “referer”
HttpRequest request = HttpRequest.newBuilder()
.header("referer", "xxx")
.uri(URI.create("https://www.baidu.com"))
.GET()
.build();
原因是,设计者基于安全考量,在设置请求头时,做了安全检查,且在JDK11版本下并未提供绕过机制,在更高版本下(LTS JDK 17)提供了绕过机制。
JDK 11 源码,受限制的请求头如下:
不要想着玩花子,反射该变量,JDK11 基于模块化设计,该 Utils 所在的包,并未开放反射权限,反射时会报错。
基于以上,如果你正在使用JDK11,且有设置以上请求头的需求,暂时无解,可以改用 apache 的 httpClient。
如果你使用了更高版本的JDK(11以上),可以设置jvm参数以绕过安全检查,以下是17的源码。
可以看到,17下,重新又放开了部分请求头,虽有小部分请求头默认受限制,但还可以使用如下方式,增加系统参数以完全绕过安全检查,所以,17环境下,可以放心大胆不受限制的拥抱全新 httpClient api。
System.setProperty("jdk.httpclient.allowRestrictedHeaders", "connection,content-length,expect,host,upgrade");