springcloud fegin获取request header解决方案

3 篇文章 0 订阅
3 篇文章 0 订阅

假设现在有A服务,B服务,外部使用RESTApi请求调用A服务,在请求头上有token字段,A服务使用完后,B服务也要使用,如何才能把token也转发到B服务呢?这里可以使用Feign的RequestInterceptor,但是直接使用一般情况下HttpServletRequest上下文对象是为空的,这里要怎么处理,请看下文。

springcloud

演示

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服务配置bootstrap.yml

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

A服务build.gradle

buildscript {
    ext{
        springBootVersion = '1.5.9.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服务Action

    @Autowired
    private HttpServletRequest servletRequest;

    public String test() {
        return servletRequest.getHeader("token");
    }

B服务问题

如若B服务也要将header请求转发到其它服务,将A服务的配置也应用到B服务上即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Cloud中使用Feign进行文件上传,可以通过以下几个步骤实现: 1. 首先,需要在项目中添加Feign和Spring Cloud的依赖,确保正确引入相关的jar包。 2. 接下来,在需要进行文件上传的服务中,创建一个Feign的Client接口,用于定义文件上传的方法。可以使用@RequestParam注解来接收文件参数,并使用@RequestLine注解定义请求方法和路径。例如: ```java @FeignClient(name = "upload-service") public interface UploadServiceClient { @RequestLine("POST /upload") void uploadFile(@RequestParam("file") MultipartFile file); } ``` 3. 然后,在上传文件的服务中,创建一个Controller类,并注入Feign的Client接口。在该Controller中,可以定义一个处理文件上传的接口,并在其中调用Feign的Client接口来实现文件上传。例如: ```java @RestController public class UploadController { @Autowired private UploadServiceClient uploadServiceClient; @PostMapping("/upload") public void upload(@RequestParam("file") MultipartFile file) { uploadServiceClient.uploadFile(file); } } ``` 4. 最后,启动应用程序,通过调用文件上传的接口来上传文件。 需要注意的是,为了使Feign能够正确处理文件的上传,还需要在配置文件中添加相关配置。具体配置内容可以参考Spring Cloud官方文档或相关教程。 总结起来,使用Feign进行文件上传需要创建Feign的Client接口、创建处理文件上传的Controller,并在配置文件中添加相关配置。通过这些步骤,就可以实现在Spring Cloud中使用Feign进行文件上传的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值