我试图覆盖'主机'通过ClientHttpRequestInterceptor。 当我调试request.getHeaders()。get(" host")行时,我能够正确更改uri。 (www.test.com)。
但是当我尝试在Spring控制器中检索GET / product映射的主机头时,我得到了null值。你有没有可以请求为什么我得到空值,尽管请求标题有“主机”#39;在获得GET /产品之前的价值。
我正在使用 resttemplate.getForObject(uri,ProductWrapper.class);
BeanFactoryIncerceptor.java :
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
RestTemplate restTemplate = new RestTemplate();
ClientHttpRequestInterceptor hostHeaderInterceptor = (request, body, execution) -> {
request.getHeaders().set("Accept", "application/json");
if(request.getURI().getPath().endsWith("/product")) {
request.getHeaders().set("host", "www.test.com");
}
ClientHttpResponse response= execution.execute(request, body);
log.info("request header host:", request.getHeaders().get("host"));
return response;
};
restTemplate.setInterceptors(Lists.newArrayList(hostHeaderInterceptor));
return restTemplate;
ProductController.java:
@GET
@Path(value = "/product")
public void getProducts(@RequestHeader(value="host") String headerHost,@RequestHeader(value="Accept") String accept)
// headerHost在这里为null。 // accept在这里为空
更新1:
@ApiParam(value = "" ,required=true )@HeaderParam("Accept") String accept,@ApiParam(value = "" ,required=true )@HeaderParam("host") String headerHost
如果我使用@HeaderParam,我现在可以获得价值。但我期待headerHost应该是www.test.com我是通过BeanFactoryInterceptor.java设置的,但是,我得到了真正的uri(www.google.com)
accept = application/json
headerHost = www.google.com
为什么www.test.com没有来控制器?请提出建议。
更新2:
在内部调试Spring RestTemplate使用的HttpUrlConnection.class后,我理解sun.net.http.allowRestrictedHeaders为false。
allowRestrictedHeaders = ((Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.net.http.allowRestrictedHeaders"))).booleanValue();
以下几点需要澄清: 在intellij中如果我创建运行配置为'应用程序'并传递“VM选项”' as -Dsun.net.http.allowRestrictedHeaders = true,主机正在通过www.test.com正确更新。
我在这个应用程序中使用spring boot和gradle。它是将与应用程序服务器中的其他应用程序一起部署的应用程序之一。
对于单个应用程序从服务器启动时传递-Dsun.net.http.allowRestrictedHeaders = true的最佳方法是什么?我对部署方面一无所知。请按照我的理解帮助您提供意见。