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