springcloud 如何解决微服务之间token传递问题

作者:PaineL 时间:2022-08-27 18:43:48 

微服务之间token传递问题

假设现在有A服务,B服务,外部使用RESTApi请求调用A服务,在请求头上有token字段,A服务使用完后,B服务也要使用,如何才能把token也转发到B服务呢?

这里可以使用Feign的RequestInterceptor,但是直接使用一般情况下HttpServletRequest上下文对象是为空的,这里要怎么处理,请看下文。

服务A中FeginInterceptor 

@Configuration
public class FeginInterceptor implements RequestInterceptor {
 
    @Override
    public void apply(RequestTemplate requestTemplate) {
        Map<String,String> headers = getHeaders(getHttpServletRequest());
        for(String headerName : headers.keySet()){
            requestTemplate.header(headerName, getHeaders(getHttpServletRequest()).get(headerName));
        }
    }
 
    private HttpServletRequest getHttpServletRequest() {
        try {
            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
 
    private Map<String, String> getHeaders(HttpServletRequest request) {
        Map<String, String> map = new LinkedHashMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            String value = request.getHeader(key);
            map.put(key, value);
        }
        return map;
    } 
}

服务A配置文件中添加:application.yml 

hystrix:  
  command:  
    default:  
      execution:  
        isolation:  
          strategy: SEMAPHORE  

服务A添加配置文件

buildscript {  
    ext{  
        springBootVersion = '1.4.5.RELEASE' //这里对应项目中的版本    
    }  
  
    repositories {  
        mavenCentral()  
    }  
    dependencies {  
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")  
        classpath "io.spring.gradle:dependency-management-plugin:0.5.6.RELEASE"  
    }  
}  
  
apply plugin: 'java'  
apply plugin: 'org.springframework.boot'  
apply plugin: "io.spring.dependency-management"  
version = '0.0.1-SNAPSHOT'  
group 'com.dounine.test'  
  
sourceCompatibility = 1.8    
repositories {  
    mavenLocal()  
    mavenCentral()  
}  
  
ext {  
    springCloudVersion = 'Dalston.SR2'  
}  
  
dependencies {  
    compile('org.springframework.cloud:spring-cloud-starter-config')  
    compile('org.springframework.cloud:spring-cloud-starter-eureka')  
    compile('org.springframework.cloud:spring-cloud-starter-feign')  
    compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.8.13'  
    compile('org.springframework.boot:spring-boot-starter-data-redis')  
    testCompile('org.springframework.boot:spring-boot-starter-test')  
}  
  
dependencyManagement {  
    imports {  
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"  
    }  
}  

若服务B或C也想传递token,加上上述A配置即可。 

微服务服务间调用传递token

微服务间的调用通常我们使用FeignClient来实现。那么如何在调用的时候传递token来保证服务间调用的安全校验呢?

没错,我们可以配置一个 * 。该 * 的功能就是在请求发出去前在header中添加token。

代码如下:

@Component
public class FeignHeaderInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        template.header(HttpHeaders.AUTHORIZATION, "token");
    }
}

RequestInterceptor是feign提供的接口

该接口只有一个方法:

public interface RequestInterceptor {
  void apply(RequestTemplate template);
}

这样被调用的服务就可以在header中拿到token来做校验了。

来源:https://blog.csdn.net/ypl603330811/article/details/80773395

标签:springcloud,微服务,token,传递
0
投稿

猜你喜欢

  • 基于WPF实现面包屑控件的示例代码

    2021-12-19 12:34:33
  • TextView实现跑马灯效果 就这么简单!

    2023-06-25 18:42:24
  • Android标题栏最右边添加按钮的实例

    2021-08-09 07:08:07
  • C#中try...catch的使用与常见面试题分享

    2022-10-22 16:30:35
  • 浅谈java内存管理与内存溢出异常

    2022-04-22 15:03:18
  • Thymeleaf 3.0 自定义标签方言属性的实例讲解

    2023-03-24 20:40:23
  • java中的类为什么只能用public修饰?

    2023-10-09 20:23:54
  • IDEA 单元测试覆盖技巧分享

    2022-09-09 03:50:26
  • 使用Maven配置Spring的方法步骤

    2023-02-05 18:37:46
  • FeignClient实现接口调用方式(不同参数形式)

    2023-03-06 08:41:39
  • Java 反射调用静态方法的简单实例

    2021-10-09 06:47:58
  • GSON实现Java对象的JSON序列化与反序列化的实例教程

    2023-11-23 12:39:02
  • Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 实现分库分表功能

    2023-08-28 16:52:09
  • RocketMQ NameServer架构设计启动流程

    2023-12-13 07:40:01
  • mybatis like模糊查询特殊字符报错转义处理方式

    2023-09-02 21:14:54
  • 关于feign.codec.DecodeException异常的解决方案

    2022-01-28 15:50:19
  • C#实现的字符串相似度对比类

    2023-08-08 20:35:10
  • Android自定义EditText实现登录界面

    2022-07-03 11:59:25
  • Android 基于agora 开发视频会议的代码

    2021-11-30 02:53:04
  • java实现图片转base64字符串 java实现base64字符串转图片

    2023-07-19 10:42:44
  • asp之家 软件编程 m.aspxhome.com