Feign傳遞Token
方法1: @RequestHeader
方法2:@RequestInterceptor
方法一狞谱,@RequestHeader
在請求調(diào)用方的微服務(wù)方法頭中添加@RequestHeader
用來接收用戶端請求時傳入的token,關(guān)鍵代碼片段
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ShareDTO findById(HttpServletRequest request,
@PathVariable Integer id,
@RequestParam(name = "foo") String foo,
@RequestHeader("X-Token") String token) {
System.out.println(foo);
return this.shareService.findById(id, token);
}
這里獲取到header中的“X-Token”
在采用Feign調(diào)用其他微服務(wù)時將獲取到的Token傳入到下一個微服務(wù)的請求頭中
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id, @RequestHeader("X-Token") String token);
這里的@RequestHeader
的意思是將參數(shù)token放入到下個請求的請求頭header中。到此系任,使用這種方式進(jìn)行token傳遞就可以實現(xiàn)了新症。
有點:容易理解
缺點:對代碼入侵性強(qiáng),每個需要傳遞token的接口都需要修改
方法2 使用Feign的Interceptor
Step1 實現(xiàn)RequestInterceptor接口
apply->獲取到X-Token
Step2 將token傳遞給下一次請求
實現(xiàn)一個RequestInterceptor
實現(xiàn)內(nèi)容如下
//省略包名
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* @author frend
* @version v0.0.1
* @apiNote feign傳遞token攔截統(tǒng)一處理
* @time 2020/10/26 12:48
* @parjectName rate-content-center
*/
public class TokenTelayRequestIntecepor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 從header獲取X-token
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes srat = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = srat.getRequest();
String token = request.getHeader("X-Token");
if (StringUtils.isNotBlank(token)) {
//將token傳遞出去
requestTemplate.header("X-Token", token);
}
}
}
這里先獲取到HTTPServletRequest
接著在從request中獲取到header的“X-Token”
將這個token傳遞給requestTemplate
Interceptor實現(xiàn)之后還需要對這個Interceptor設(shè)置配置
Step3 配置Feign
給全局配置一個 requestInterceptors: 將上面的實現(xiàn)了RequestInterceptor的類全路徑給這個配置
feign:
client:
config:
default:
loggerLevel: full
requestInterceptors:
- org.rate.contentcenter.feignclients.interceptor.TokenTelayRequestIntecepor
到此响禽,全局的FeignToken傳遞就實現(xiàn)完成了徒爹。
最后做個總結(jié):
1.使用@RequestHeader
的方式比較直觀,也較為容易理解芋类,但是當(dāng)對接口進(jìn)行改造隆嗅,或者服務(wù)接口過多時,任務(wù)量巨大
2.使用RequestInterceptor
攔截器侯繁,在理解上有一些抽象胖喳,不過這種方式在實際操作和代碼的耦合上是非常有優(yōu)勢的。
通過Feign傳遞Token的內(nèi)容就基本完成了贮竟,祝大家變得更強(qiáng)