微服务之间token传递问题
假设现在有A服务,B服务,外部使用RESTApi请求调用A服务,在请求头上有token字段,A服务使用完后,B服务也要使用,如何才能把token也转发到B服务呢?
这里可以使用Feign的RequestInterceptor,但是直接使用一般情况下HttpServletRequest上下文对象是为空的,这里要怎么处理,请看下文。
服务A中FeginInterceptor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
@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
1
2
3
4
5
6
|
hystrix: command: default: execution: isolation: strategy: SEMAPHORE |
服务A添加配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
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。
代码如下:
1
2
3
4
5
6
7
|
@Component public class FeignHeaderInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { template.header(HttpHeaders.AUTHORIZATION, "token" ); } } |
RequestInterceptor是feign提供的接口
该接口只有一个方法:
1
2
3
|
public interface RequestInterceptor { void apply(RequestTemplate template); } |
这样被调用的服务就可以在header中拿到token来做校验了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/ypl603330811/article/details/80773395