微服务之间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
查看更多关于springcloud 如何解决微服务之间token传递问题的详细内容...