zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    vue类似tab切换的效果,显示和隐藏的判断。
    vue 默认展开详情页
    vue echarts圆角阴影效果
    vue画图运用echarts
    随机函数rand()
    Qt解析CSV文件
    Qt生成CSV 文件
    QRegExp解析
    Qt中csv文件的导入与导出
    Qt 生成word、pdf文档
  • 原文地址:https://www.cnblogs.com/lmyupupblogs/p/13036354.html
Copyright © 2011-2022 走看看