SpringCloud RestTemplate通過攔截器統一添加token


寫在前面:在進行本地遠程調用時如果沒有攜帶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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM