关于 JDK11 HttpClient restricted header name: “xxx“ 异常详解

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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值