寫在前面:在進行本地遠程調用時如果沒有攜帶token在調某些接口時可能會報401,所以簡單實現一個通過攔截器實現對RestTemplate統一添加token,這樣再業務中通過restTemplate發起遠程調用時,無需再傳token即可進行調用。
下面直接上代碼吧:
攔截器:
package xxxxxx; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.List; /** * @author * @description RestTemplate 統一添加 access_token 攔截器 * @date 2020/6/2 * @projectName share-capacity-platform */ @Component public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] body, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); String auth = request.getHeader("Authorization"); String accessToken = request.getParameter("access_token"); List<String> authorizations = httpRequest.getHeaders().get("Authorization"); String authorization = ""; if (accessToken != null){ authorization = "bearer " + accessToken; }else if (auth != null){ authorization = auth; }else if (authorizations != null){ authorization = "bearer " + authorizations.get(0); } HttpHeaders headers = httpRequest.getHeaders(); headers.add("Authorization", authorization); return clientHttpRequestExecution.execute(httpRequest, body); } }
RestTemplateConfig:
package xxxxxx; /* * Copyright (c) 2005, 2019, EVECOM Technology Co.,Ltd. All rights reserved. * EVECOM PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.RestTemplate; import java.util.Collections; /** * <P><B>Description: </B> 描述 </P> * Revision Trail: (Date/Author/Description) * 2019/7/18 * @version 1.0 */ @Configuration public class RestTemplateConfig { @Autowired HeaderRequestInterceptor headerRequestInterceptor; @Bean @LoadBalanced public RestTemplate restTemplate() { // 長連接 PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager(); // 總連接數 pollingConnectionManager.setMaxTotal(1000); // 同路由的並發數 pollingConnectionManager.setDefaultMaxPerRoute(1000); HttpClientBuilder httpClientBuilder = HttpClients.custom(); httpClientBuilder.setConnectionManager(pollingConnectionManager); // 重試次數,默認是3次,沒有開啟 // httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, // true)); HttpClient httpClient = httpClientBuilder.build(); HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory( httpClient); // 連接超時 clientHttpRequestFactory.setConnectTimeout(60000); // 數據讀取超時時間,即SocketTimeout clientHttpRequestFactory.setReadTimeout(60000); // 連接不夠用的等待時間,不宜過長,必須設置,比如連接不夠用時,時間過長將是災難性的 clientHttpRequestFactory.setConnectionRequestTimeout(200); // 緩沖請求數據,默認值是true。通過POST或者PUT大量發送數據時,建議將此屬性更改為false,以免耗盡內存。 RestTemplate restTemplate = new RestTemplate(); //set攔截器統一添加token restTemplate.setInterceptors(Collections.singletonList(headerRequestInterceptor)); restTemplate.setRequestFactory(clientHttpRequestFactory); restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); return restTemplate; } }
總結:
通過攔截器將token添加到請求頭中,然后在RestTemplateConfig 配置類中添加該攔截器,即可簡單實現RestTemplate統一添加token。