Feign 调用出现异常:feign.FeignException: status 401 reading xxx#xxx(xxx)

这篇具有很好参考价值的文章主要介绍了Feign 调用出现异常:feign.FeignException: status 401 reading xxx#xxx(xxx)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

异常描述

微服务 Controller 层方法通过 Feign 调用某个微服务方法,出现以下异常:

feign.FeignException: status 401 reading UserFeign#updateLoginTime(Integer)
	at feign.FeignException.errorStatus(FeignException.java:78)
	at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:93)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:149)
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)
	at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
	at com.sun.proxy.$Proxy103.updateLoginTime(Unknown Source)

异常原因

权限校验失败
即有某个地方会校验该 Feign 请求的授权信息,然后未通过,返回了 401 这个错误码
不一定是 Feign 本身的权限校验,虽然是 Feign 报的异常
一开始因为是 Feign 报的异常,我就开始找 Feign 请求拦截器等,但是一无所获
后来发现,是因为 Feign 请求中缺失 Cookie,导致被网关拦截器拦截

异常分析

我的安全校验逻辑如下: 非登录请求进入网关后,校验 cookie,根据 cookie 值,从 Redis 中取出 JWT,并存入请求头中
每个微服务会解析请求头中的 JWT,以此获取登录用户信息

前端的请求进入 Controller 中后,Controller 的方法再调用 Feign
此时的 Feign 请求是获取不到请求头的,微服务也就无法获取登录用户信息

所以我在微服务中增加了 Feign 拦截器,用来增强请求:将前端请求中的请求头信息存入 Feign 请求中:

/**
 * Feign 调用增强请求头,防止登录信息无法传递而被服务拦截
 *
 * @author Eugenema
 * @date 2022/7/30 12:05
 */
@Component
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        //获取客户端访问的请求
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(requestAttributes != null){
            HttpServletRequest request = requestAttributes.getRequest();
            if (request != null) {
                String token = request.getHeader("Authorization");

                //同步到 feign 请求中
                requestTemplate.header("Authorization", token);
                return;
            }
        }
    }
}
但是
我的 Feign 调用,配置的是网关,而不是具体的某个微服务
/**
 * 用户 feign 调用
 *
 * @author Eugenema
 * @date 2022/7/23 17:16
 */
@FeignClient(contextId = "userService", name = "gatewayService", path = "/userService")
@RequestMapping("/user")
public interface UserFeign {
……
}

故,Feign 请求会先经过 Feign 拦截器,将请求头加入到请求中
然后再经过网关拦截器,结果网关拦截器会先检查 Cookie 是否存在:很明显,不存在!!!
于是网关拦截器就拦截了,然后 Feign 调用就报错了……

异常解决

在 Feign 请求拦截器中,除了增强请求头外,把 Cookie 也加上

/**
 * Feign 调用增强请求头,防止登录信息无法传递而被服务拦截
 *
 * @author Eugenema
 * @date 2022/7/30 12:05
 */
@Component
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        //获取客户端访问的请求
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(requestAttributes != null){
            HttpServletRequest request = requestAttributes.getRequest();
            if (request != null) {
                String cookie = request.getHeader("Cookie");
                String token = request.getHeader("Authorization");

                //同步到 feign 请求中
                requestTemplate.header("Cookie", cookie);
                requestTemplate.header("Authorization", token);
                return;
            }
        }
    }
}

疑问

因为异常是在 Feign 中报出来的,且我的网关拦截器是会对拦截下来的请求打印日志的
但是网关当时并没有日志打印,所以一开始没有往这边想
不太清楚是因为啥文章来源地址https://www.toymoban.com/news/detail-453236.html

到了这里,关于Feign 调用出现异常:feign.FeignException: status 401 reading xxx#xxx(xxx)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud Feign调用异常:feign.RetryableException: connect timed out executing POST http://xxx

    本机JUnit单元测试时,调用部署在开发环境(Centos7)的服务时,报feign.RetryableException: connect timed out 直接访问服务地址时,提示网络无法访问 http://192.168.1.15:7002/comDictionary/getDictionaryById?dictionaryId=GIVE_LOGIN 发现端口没有打开。需要打开linux防火墙的端口 firewall-cmd --permanent --zon

    2024年03月22日
    浏览(38)
  • springboot - feign.FeignException$BadRequest: [400] during [GET] to [http:

    ERROR 失败原因: feign.FeignException$BadRequest: [400] during [GET] to [http://方法?携带的请求头条件。。。。。 [ManualStockControllerFeign#deleteManualStockTaskByIds(List)]: !doctype htmlhtml lang=\\\"en\\\"headtitleHTTP Status 400 – Bad Request/titlestyle type=\\\"text/css\\\"body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;ba

    2024年02月02日
    浏览(33)
  • 【问题解决】feign.FeignException$ServiceUnavailable: [503] during [GET] to [http://stock-query/stock/query

    问题描述: 错误信息显示为`feign.FeignException$ServiceUnavailable: [503]`,这表示服务不可用,即服务器无法处理请求。错误消息还指出负载均衡器中没有包含该服务的实例。 1. 服务不可用:出现503错误通常表示目标服务当前无法提供服务。这可能是由于服务器维护、过载或其他故障

    2024年02月15日
    浏览(30)
  • feign自定义第三方接口;配置化Feign接口URL;调用指定IP的feign服务

    最近接手一个项目,各子工程之间通过feign调用;各服务部署在K8S上,通过nacos管理配置;由于服务部署的机器无法开放端口等原因,导致本机服务与测试环境网络端口无法互通,故需要重写feign的调用地址;个人总结的方法有以下几种: 目录  第一种:feignclient配置URL 第二种

    2024年02月04日
    浏览(52)
  • Java 【dubbo rpc改feign调用】feign接口调用 Body parameter 4 was null

    【框架改造问题点记录,dubbo改为spring cloud alibaba】 【第四篇】feign接口调用 Body parameter 4 was null 【描述】Feign是一个声明式的Web服务客户端,它使得写HTTP客户端变得更简单。如果你在使用Feign进行服务调用时遇到了\\\"Body parameter 4 was null\\\"这样的错误,这通常意味着你尝试将一个

    2024年02月11日
    浏览(32)
  • [RPC]:Feign远程调用

    摘要:RestTemplate;Feign;远程调用; Feign是一个简化HTTP客户端编写的框架,通过声明式方式将远程服务调用封装成简单接口调用。 1.2.1 使用RestTemplate发送远程调用代码 要求:系统调用者在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。 1.2.1.1 项目示例

    2024年02月10日
    浏览(36)
  • 【微服务】Feign远程调用

           📝个人主页: 五敷有你         🔥系列专栏: 微服务 ⛺️稳中求进,晒太阳 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:GitHub - OpenF

    2024年03月28日
    浏览(35)
  • 微服务远程调用Feign

    目录 RPC概述 什么是Feign? RibbonFeign对比 Feign的设计架构 Spring Cloud Alibaba快速整合Feign Spring Cloud Feign扩展 日志配置 契约配置 通过拦截器实现参数传递 自定义拦截器实现认证逻辑 超时时间配置 微服务之间如何方便优雅的实现服务间的远程调用? RPC 全称是 Remote Procedure Call ,

    2024年03月14日
    浏览(32)
  • 搭建feign远程调用环境

    在我的SpringCloud专栏中已经介绍过SpringCloud五大组件的环境搭建,各个环境的搭建都有详细的步骤讲解,之前我们说过各个服务搭建都是不依赖于之前的环境的,本节介绍的Feign服务间远程调用也是,本次也是侧重于环境搭建,Feign的作用我们之前已经介绍过了。可以查看:0

    2024年01月17日
    浏览(25)
  • gateway调用feign

            在搭建项目的时候,需要网关去校验请求的合法性。这里通过gateway的filter中通过调用feign接口去验证token的方式实现。 todo 接口配置 在微服务中,只展示controller的代码,其他的自己实现就可以。 feign接口 在这里根据spring.profiles.active动态去配置服务名,方便区分测

    2024年02月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包