问题
发送请求时,在header中添加host参数,但发送的http请求中,header中无此参数,而是真实的host.
解决办法
需在应用启动时添加
添加:System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
探究
spring resttemplate
resttemplate只是对其他的HTTP客户端的封装,其本身并没有实现HTTP相关的基础功能。其底层实现是可以配置切换的。 RestTemplate 支持至少三种HTTP客户端库。
- SimpleClientHttpRequestFactory。对应的HTTP库是java JDK自带的HttpURLConnection。
- HttpComponentsAsyncClientHttpRequestFactory。对应的HTTP库是Apache HttpComponents。
- OkHttp3ClientHttpRequestFactory。对应的HTTP库是OkHttp
java JDK自带的HttpURLConnection是默认的底层HTTP实现客户端
SimpleClientHttpRequestFactory,即java JDK自带的HttpURLConnection不支持HTTP协议的Patch方法,如果希望使用Patch方法,需要将底层HTTP客户端实现切换为Apache HttpComponents 或 OkHttp
可以通过设置setRequestFactory方法,来切换RestTemplate的底层HTTP客户端实现类库。 - 参考http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac2%e7%af%87-%e5%a4%9a%e7%a7%8d%e5%ba%95%e5%b1%82http%e5%ae%a2%e6%88%b7%e7%ab%af%e7%b1%bb%e5%ba%93%e7%9a%84%e5%88%87%e6%8d%a2/.html
sun.net.www.protocol.http.HttpURLConnection
146 /*
147 * Restrict setting of request headers through the public api
148 * consistent with JavaScript XMLHttpRequest2 with a few
149 * exceptions. Disallowed headers are silently ignored for
150 * backwards compatibility reasons rather than throwing a
151 * SecurityException. For example, some applets set the
152 * Host header since old JREs did not implement HTTP 1.1.
153 * Additionally, any header starting with Sec- is
154 * disallowed.
155 *
156 * The following headers are allowed for historical reasons:
157 *
158 * Accept-Charset, Accept-Encoding, Cookie, Cookie2, Date,
159 * Referer, TE, User-Agent, headers beginning with Proxy-.
160 * 161 * The following headers are allowed in a limited form:
162 *
163 * Connection: close
164 *
165 * See http://www.w3.org/TR/XMLHttpRequest2.
166 */
232 allowRestrictedHeaders = ((Boolean)java.security.AccessController.doPrivileged(
233 new sun.security.action.GetBooleanAction(
234 "sun.net.http.allowRestrictedHeaders"))).booleanValue();
235 if (!allowRestrictedHeaders) {
236 restrictedHeaderSet = new HashSet<String>(restrictedHeaders.length);
237 for (int i=0; i < restrictedHeaders.length; i++) {
238 restrictedHeaderSet.add(restrictedHeaders[i].toLowerCase());
239 }
240 } else { 241 restrictedHeaderSet = null;
242 }
Java中System.setProperty()
https://stackoverflow.com/questions/21204334/system-setproperty-and-system-getproperty
https://www.cnblogs.com/chasewade/p/3387390.html
/*
* 设置指定键对值的系统属性
* setProperty (String prop, String value);
*
* 参数:
* prop - 系统属性的名称。
* value - 系统属性的值。
*
* 返回:
* 系统属性以前的值,如果没有以前的值,则返回 null。
*
* 抛出:
* SecurityException - 如果安全管理器存在并且其 checkPermission 方法不允许设置指定属性。
* NullPointerException - 如果 key 或 value 为 null。
* IllegalArgumentException - 如果 key 为空。
* 注:这里的system,系统指的是 JRE (runtime)system,不是指 OS。
*
*/