2016-11-18 61 views
0

我可以控制或配置部署在Tomcat中的单个webapp的代理服务器信息吗?在工作中,我是一个企业防火墙后面,所以如果我在执行环境中设置代理信息访问外部网络资源(第三方REST API,在我的情况)的任何代码只会工作:仅在开发中的Tomcat webapp的代理服务器设置

System.setProperty("https.proxyHost", "proxy.company.com"); 
System.setProperty("https.proxyPort", "2345"); 

但我不希望将其包含在代码中,因为生产环境不涉及代理服务器。

如何外部化此配置,以便我可以在开发环境中设置代理服务器配置/标志,但跳过生产环境中的步骤?无论解决方案是什么,它只会影响特定的Web应用程序,而不会影响Tomcat服务器上的所有Web应用程序。

编辑11/21/2016:我使用Spring的RestTemplate来调用REST API方法。

@RequestMapping(value="/{userId}", 
     method = RequestMethod.GET) 
public ResponseEntity<String> getUserInfo(@PathVariable String userId, 
     @RequestHeader String apikey) { 

    String url = UserAPIProperties.getUsersUrl() + "https://stackoverflow.com/users/{userId}"; 

    // Set headers for the request 
    Map<String,Object> headersMap = new HashMap<String,Object>(); 
    headersMap.put("apiKey", apiKey); 
    headersMap.put("Accept", "application/json"); 
    HttpEntity<?> httpEntity = getHttpEntity(headersMap); 

    log.debug("API Key: {}, User ID: {}", apikey, userId); 

    RestTemplate restTemplate = new RestTemplate(); 
    return restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class, userId); 
} 

回答

0

不要使用系统属性来执行此操作。

而是使用REST API的实际API直接设置代理信息。否则,你会影响整个JVM,这可能不是你想要做的。

由于您使用Spring的RestTemplate,该SO答案应该帮助编程更改正在使用的代理服务器:

+0

是的,这正是我想避免的。你可以在我如何使用API​​实现该代码片段中包含代码片段?此外,这仅适用于开发,所以我不想影响REST API代码。换句话说,生产代码不应该设置任何代理信息。 –

+0

您从未提及过您使用过的第三方REST API,因此不能提供代码示例。 –

+0

我不确定为什么特定的第三方服务与代码相关。我所拥有的是他们的服务URL(包括操作)和API密钥。如果我在JVM中设置代理服务器信息,则REST调用返回响应就好了。如果我没有设置代理服务器信息,则通话超时。我知道只有两个选项...(i)在环境中设置信息或(ii)有条件地使用'java.net.Proxy'和某种类型的'org.springframework.http.client.ClientHttpRequestFactory'环境对应于发展。我想避免影响整个JVM,或者污染代码。 –