使用入站请求标头自动装载出境RestTemplate的HttpEntity

时间:2016-11-29 00:39:59

标签: java spring spring-boot autowired

我的Spring Boot应用程序将接收请求,其部分处理流程是将其他请求发送到其他RESTful微服务并按下响应,然后再将其发送回请求者。

流程如下:

Requester -> My Controller -> My Service -> Upstream Service
            [    My Spring Boot Scope   ]

我使用RestTemplate来启动对上游服务的请求。

请求者发送的入站请求将包含一些标头,例如AuthorizationCorrelationID,我需要抓取并复制到出站RestTemplate请求中,我希望找到一种更有效的表现方式。

我正在考虑的是定义一个自动装配的Request - 作用域HttpEntity bean Request - 作用于我的Configuration类,它将读取传入的标题并将其注入HttpEntity bean。但我无法弄清楚如何阅读Configuration类本身的请求标头。我不想在控制器级别这样做,因为这意味着实现控制器的每个团队成员都需要这样做。

这可能实现吗?

2 个答案:

答案 0 :(得分:0)

对于您的场景,最好使用Apache Http客户端,从您可以插入到apache http客户端的入站参数(授权等)。

post.setHeader("Host", "accounts.google.com");
post.setHeader("User-Agent", USER_AGENT);
post.setHeader("Accept",
         "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
post.setHeader("Accept-Language", "en-US,en;q=0.5");
post.setHeader("Cookie", getCookies());
post.setHeader("Connection", "keep-alive");
post.setHeader("Referer", "https://accounts.google.com/ServiceLoginAuth");
post.setHeader("Content-Type", "application/x-www-form-urlencoded");

post.setEntity(new UrlEncodedFormEntity(postParams));

HttpResponse response = client.execute(post);
int responseCode = response.getStatusLine().getStatusCode();

答案 1 :(得分:0)

我已设法通过以下代码完成此操作。关键是必须将Scope设置为使用配置的ScopedProxyMode进行请求。

@Configuration
public class ApplicationConfig {
    private static final List<String> ALLOW_HEADER_LIST = Arrays.asList("correlationid", "userid", "accept-language", "loginid", "channelid");

    @Bean
    @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public HttpHeaders httpHeaders() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        HttpServletRequest curRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        Enumeration<String> headerNames = curRequest.getHeaderNames();

        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String header = headerNames.nextElement();
                String value = curRequest.getHeader(header);
                if (ALLOW_HEADER_LIST.contains(header.toLowerCase())) {
                    log.info("Adding header {} with value {}", header, value);
                    httpHeaders.add(header, value);
                } else log.debug("Header {} with value {} is not required to be copied", header, value);
            }
        }


        return httpHeaders;
    }
}