在开发项目过程中,使用的架构 springboot + vue,但java项目又拆分成一个基础授权(base)项目,一个获取授权(auth)项目,还有两个业务系统。此时需要通过auth项目去获取base项目的授权信息。因此使用了springboot的RestTemplate来实现不同项目之间的访问。但是在base项目中,安全起见增加了请求拦截器,此时获取header成了问题。搜索了很多的帖子,终于在今天解决掉了,现在把实现方案记录下来。
请求方
增加interceptor
public static class UserAgentInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
// 这种方案我没有实现成功,所以用的自定义字段
// headers.add(HttpHeaders.USER_AGENT, "your agent");
headers.add("customer_agent", "your agent");
return execution.execute(request, body);
}
}
设置interceptor
@Bean
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(CONN_TIMEOUT_IN_MILLIS);
httpRequestFactory.setConnectTimeout(CONN_TIMEOUT_IN_MILLIS);
httpRequestFactory.setReadTimeout(READ_TIMEOUT_IN_MILLIS);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters()
.add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
restTemplate.setInterceptors(Collections.singletonList(new UserAgentInterceptor()));
return restTemplate;
}
服务方
获取自定义的header
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);