背景
使用Feign调用内部接口时,前端发起的请求Token传递有问题,无法正常解析Token信息。定时任务调用Feign接口的时候,由于是内部发起的调用,自然也没有Token,也报错Token解析异常。
Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
解决方案
import cn.dev33.satoken.same.SaSameUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
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;
@Component
public class FeignInterceptor implements RequestInterceptor {
/**
* 为 Feign 的 RCP调用 添加请求头Token
*/
@Override
public void apply(RequestTemplate requestTemplate) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes == null){
// 不是Web请求,使用SaToken提供的 SAME_TOKEN
requestTemplate.header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken());
return;
}
// 获取 HttpServletRequest 对象
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
// 从请求头中获取Token信息
String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
//添加token
if (StringUtils.isEmpty(authorization)) {
// 请求头没有Token时,使用SaToken提供的 SAME_TOKEN
requestTemplate.header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken());
} else {
requestTemplate.header(HttpHeaders.AUTHORIZATION, authorization);
}
}
}