Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写主机-ClientHttpRequestInterceptor(Spring RestTemplate)_Java_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

Java 重写主机-ClientHttpRequestInterceptor(Spring RestTemplate)

Java 重写主机-ClientHttpRequestInterceptor(Spring RestTemplate),java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我试图通过ClientHttpRequestInterceptor覆盖“主机”。 当我调试request.getHeaders().get(“主机”)行时,我能够找到我正确更改的uri。(www.test.com) 但是,当我尝试在SpringController中检索主机头以进行GET/product映射时,得到的是null值。请您说明为什么在点击get/product之前请求头有“host”值,但我却得到空值 我正在使用restemplate.getForObject(uri,Product

我试图通过ClientHttpRequestInterceptor覆盖“主机”。 当我调试request.getHeaders().get(“主机”)行时,我能够找到我正确更改的uri。(www.test.com)

但是,当我尝试在SpringController中检索主机头以进行GET/product映射时,得到的是null值。请您说明为什么在点击get/product之前请求头有“host”值,但我却得到空值

我正在使用restemplate.getForObject(uri,ProductWrapper.class)

beanfactorynceptor.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)
@ApiParam(value = "" ,required=true )@HeaderParam("Accept") String accept,@ApiParam(value = "" ,required=true )@HeaderParam("host") String headerHost
//headerHost在此为空。 //accept在此为空

更新1:

 @GET
        @Path(value = "/product")
        public void getProducts(@RequestHeader(value="host") String headerHost,@RequestHeader(value="Accept") String accept)
@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)

为什么www.test.com没有来到控制器?请提出你的建议

更新2:

 @GET
        @Path(value = "/product")
        public void getProducts(@RequestHeader(value="host") String headerHost,@RequestHeader(value="Accept") String accept)
@ApiParam(value = "" ,required=true )@HeaderParam("Accept") String accept,@ApiParam(value = "" ,required=true )@HeaderParam("host") String headerHost
在调试spring RestTemplate内部使用的HttpUrlConnection.class之后,我了解到sun.net.http.AllowerPrictedHeaders是false

 allowRestrictedHeaders = ((Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.net.http.allowRestrictedHeaders"))).booleanValue();
以下几点需要澄清: 在intellij中,如果我将运行配置创建为“应用程序”,并将“VM选项”传递为-Dsun.net.http.allowertrictedheaders=true,则主机将通过www.test.com正确更新

我在这个应用程序中使用SpringBoot和gradle。它是将与应用服务器中的其他应用程序一起部署的应用程序之一


当单个应用程序从服务器启动时,传递-Dsun.net.http.AllowerPrictedHeaders=true的最佳方法是什么?我不知道部署方面的情况。请帮助我理解您的输入。

我想您知道请求和响应是如何工作的。以有意义的方式编写浏览器和服务器端代码。浏览器通过实际的主机部分将请求发送到服务器,然后引用、方法、编码类型等。这是每个服务器端应用程序必须遵循的标准。我们不能像客户端(浏览器)那样将主机作为abc.com发送,然后我们可以在到达服务器端代码时进行操作。违反标准。实际上,您正在讨论更改http请求,它位于服务器端。想想它和www标准。@Vaibs。我同意你的看法。我们在应用程序中有一些遗留代码,我们无法通过更改体系结构来实现某些需求。最后,我们决定在响应中更改主机。@vaibs。如果我在websphere server中的JVM_OPTS中添加sun.net.http.allowertrictedheaders=true,那么托管在wepsphere服务器上的所有应用程序是否都将具有sun.net.http.allowertrictedheaders=true?是否可以为一个应用程序配置sun.net.http.allowertrictedheaders=true,为wepshere服务器中的所有其他应用程序配置sun.net.http.allowertrictedheaders=false?我想将其作为一个解决方案发布,但我会评论说,我们可以欺骗或愚弄浏览器,用户只能以任何方式使用浏览器,桌面/手机/手机内部使用android chrome或iPhone在其应用程序内部使用Safari。实际上,我们从服务器端更改主机的应用程序将仅由后台管理团队维护和访问。最终用户无法访问此应用程序。我想您知道请求和响应是如何工作的。以有意义的方式编写浏览器和服务器端代码。浏览器通过实际的主机部分将请求发送到服务器,然后引用、方法、编码类型等。这是每个服务器端应用程序必须遵循的标准。我们不能像客户端(浏览器)那样将主机作为abc.com发送,然后我们可以在到达服务器端代码时进行操作。违反标准。实际上,您正在讨论更改http请求,它位于服务器端。想想它和www标准。@Vaibs。我同意你的看法。我们在应用程序中有一些遗留代码,我们无法通过更改体系结构来实现某些需求。最后,我们决定在响应中更改主机。@vaibs。如果我在websphere server中的JVM_OPTS中添加sun.net.http.allowertrictedheaders=true,那么托管在wepsphere服务器上的所有应用程序是否都将具有sun.net.http.allowertrictedheaders=true?是否可以为一个应用程序配置sun.net.http.allowertrictedheaders=true,为wepshere服务器中的所有其他应用程序配置sun.net.http.allowertrictedheaders=false?我想将其作为一个解决方案发布,但我会评论说,我们可以欺骗或愚弄浏览器,用户只能以任何方式使用浏览器,桌面/手机/手机内部使用android chrome或iPhone在其应用程序内部使用Safari。实际上,我们从服务器端更改主机的应用程序将仅由后台管理团队维护和访问。最终用户无法访问此应用程序。