SpringCloud Alibaba微服务番外篇二 - Feign传递Access_Token
2020/3/26 17:01:43
本文主要是介绍SpringCloud Alibaba微服务番外篇二 - Feign传递Access_Token,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述
还记得我们之前创建订单的流程吗?
通过网关调用order-service的create
方法,然后order-service再通过feign调用account-service 的reduce
和 product-service的 deduct
方法进行业务逻辑处理。
当我们项目整合好oauth2后再来调用之前的方法发现调用异常,查看后端日志发现如下的错误信息:
org.springframework.security.authentication.InsufficientAuthenticationException: Full authentication is required to access this resource Request processing failed; nested exception is feign.FeignException$Unauthorized: status 401 reading AccountFeign#reduce(String,BigDecimal) 复制代码
错误信息告诉我们是接口未授权导致访问异常,实际上我们已经将access_token放在了header上,如下:
最后通过对自定义异常类进行跟踪发现是access_token经过order-service访问account-service时丢失了,获取的accessToken为null。
本节主要是来解决使用feign调用时access_token丢失的问题。
代码示例
Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器只需要实现 RequestInterceptor
接口,该接口的方法有 RequestTemplate 类型的参数,我们可以根据实际情况对请求的信息进行调整。
public interface RequestInterceptor { void apply(RequestTemplate var1); } 复制代码
我们要实现的功能很简单,就是取出原来的请求头,再将其传递给下游服务,在order-service中建立 FeignRequestInterceptor
并给其添加@Configuration
注解,代码如下:
/** * Description: * 微服务之间feign调用请求头丢失的问题 * @author javadaily * @date 2020/02/24 9:28 */ @Configuration @Slf4j public class FeignRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { HttpServletRequest httpServletRequest = getHttpServletRequest(); if(httpServletRequest!=null){ Map<String, String> headers = getHeaders(httpServletRequest); // 传递所有请求头,防止部分丢失 //此处也可以只传递认证的header //requestTemplate.header("Authorization", request.getHeader("Authorization")); for (Map.Entry<String, String> entry : headers.entrySet()) { template.header(entry.getKey(), entry.getValue()); } log.debug("FeignRequestInterceptor:{}", template.toString()); } } private HttpServletRequest getHttpServletRequest() { try { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } catch (Exception e) { return null; } } /** * 获取原请求头 */ private Map<String, String> getHeaders(HttpServletRequest request) { Map<String, String> map = new LinkedHashMap<>(); Enumeration<String> enumeration = request.getHeaderNames(); if(enumeration!=null){ while (enumeration.hasMoreElements()) { String key = enumeration.nextElement(); String value = request.getHeader(key); map.put(key, value); } } return map; } } 复制代码
完成配置后重启服务器,再次调用create方法,正常返回响应结果。
系列文章
这篇关于SpringCloud Alibaba微服务番外篇二 - Feign传递Access_Token的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南