Feign如何设置请求头呢?

乔欣 Spring Cloud 发布时间:2023-05-05 20:48:38 阅读数:17388 1
今天在使用Feign进行微服务之间的调用,出现没有Token的现象,那么如何实现实现微服务调用之间置于token的效果,
使其之间可以自由的访问,下文笔者将讲述具体的设置方式
1.定义一个Feign配置类
     实现Feign的RequestInterceptor接口
	 重写其中的apply方法
     为RequestTemplate添加请求头信息
2.在Feign调用时,使用其配置类,即可达到Feign请求时
     自动添加token信息
例1:

//Feign 配置类1 

@Component
public class FeignClientsConfigurationCustom implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
    // 此种方式是线程安全的
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
    // 不为空时取出请求中的header 原封不动的设置到feign请求中
        if (null != attributes) {
            HttpServletRequest request = attributes.getRequest();
            if (null != request) {
        // 遍历设置 也可从request取出整个Header 写到RequestTemplate 中
                Enumeration<String> headerNames = request.getHeaderNames();
                if (headerNames != null) {
                    while (headerNames.hasMoreElements()) {
                        String name = headerNames.nextElement();
                        String values = request.getHeader(name);
                        requestTemplate.header(name, values);
                    }
                }
            }
        }
    }
}

或
  
package org.jeecg.config;


import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.CommonConstant;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 *
 *  @Description:自定义 Feign 配置信息 添加上下文 token
 *  @author: Java265.com
 * */
@Component
public class FeignClientsConfigurationCustom implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate requestTemplate) {

        ServletRequestAttributes attributes 
		= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (null != attributes) {
            HttpServletRequest request = attributes.getRequest();
            // 将token信息放入header中
            String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
            if (token == null || "".equals(token)) {
                requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, UserTokenContext.getToken());
            }
        }
    }
}


Feign中使用时,只需加入相应的配置类即可

@FeignClient(name = "testClient", configuration = FeignClientsConfigurationCustom.class)
public interface testServer{
}

Controller中异步调用Feign接口

@Autowired
private TestService testService;

@GetMapping("/test")
public String test(){
    //设置线程会话Token
	UserTokenContext.setToken(TemporaryTokenUtil.getTemporaryToken());


    // 此方法是一个异步方法
    //在该方法中调用了Feign服务
    //此时方法中会自动加入请求头
	testService.testMethod();

	//使用完删除Token,避免性能
	UserTokenContext.remove();
    return "Hello world!";
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringCloud/202305/6362.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者