当前位置:首页 > 服务端 > feign拦截器

feign拦截器

2022年11月09日 14:19:53服务端6

概述

有的时候业务场景是不走正常路线的,业务场景千奇百怪的需求都有, 有的时候权限校验需要在网关那里统一鉴权,有的时候就需要下放到某个微服务去处理(不在网关那里统一鉴权)

通常我们调用的接口都是有权限控制的,很多时候可能认证的值是通过参数去传递的,还有就是通过请求头去传递认证信息,比如 Basic 认证方式。 接口鉴权

Feign 中我们可以直接配置 Basic 认证

@Configuration  // 全局配置
public class FeignConfig {
     
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
     
        return new BasicAuthRequestInterceptor("fox", "123456");
    }
}

**扩展点: feign.RequestInterceptor **
每次 feign 发起http调用之前,会去执行拦截器中的逻辑。

public interface RequestInterceptor {
     
 
  /**
   * Called for every request. Add data using methods on the supplied {@link RequestTemplate}.
   */
  void apply(RequestTemplate template);
}

使用场景

  1. 统一添加 header 信息;
  2. 对 body 中的信息做修改或替换;

自定义拦截器实现认证逻辑

FeignConfig

package feigndemo.config;

import feigndemo.interceptor.FeignAuthRequestInterceptor;
import feign.Logger;
import feign.Request;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

 @Configuration  // 全局配置
public class FeignConfig {
     

     /**
      * 日志级别
      * 通过源码可以看到日志等级有 4 种,分别是:
      * NONE:不输出日志。
      * BASIC:只输出请求方法的 URL 和响应的状态码以及接口执行的时间。
      * HEADERS:将 BASIC 信息和请求头信息输出。
      * FULL:输出完整的请求信息。
      */
     @Bean
     public Logger.Level feignLoggerLevel() {
     
         return Logger.Level.FULL;
     }

    /**
     * 自定义拦截器
     * @return
     */
    @Bean
    public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
     
        return new FeignAuthRequestInterceptor();
    }

    @Bean
    public Request.Options options() {
     
        return new Request.Options(5000, 5000);
    }

    @Bean
    public Decoder decoder() {
     
        return new JacksonDecoder();
    }
    @Bean
    public Encoder encoder() {
     
        return new JacksonEncoder();
    }

}

FeignAuthRequestInterceptor

package feigndemo.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;

import java.util.UUID;

public class FeignAuthRequestInterceptor implements RequestInterceptor {
     
    @Override
    public void apply(RequestTemplate template) {
     
        // 业务逻辑  模拟认证逻辑
        // 请求头携带token
        String access_token = "IAmToken"+UUID.randomUUID().toString();
        template.header("Authorization",access_token);
    }
}

这样在feign远程调用的时候自动将Authorization携带到header里面了,然后服务的被调用方就可以从header里面获取这个信息了

feign输出:

2022-01-13 12:18:04.322 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] ---> GET http://mall-order/order/findOrderByUserId/1 HTTP/1.1
2022-01-13 12:18:04.323 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] Authorization: IAmToken53ce45ea-dc4f-4908-9492-e4f6ac43c1c2
2022-01-13 12:18:04.323 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] ---> END HTTP (0-byte body)
2022-01-13 12:18:04.640 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] <--- HTTP/1.1 200 (314ms)
2022-01-13 12:18:04.640 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] connection: keep-alive
2022-01-13 12:18:04.640 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] content-type: application/json
2022-01-13 12:18:04.641 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] date: Thu, 13 Jan 2022 04:18:04 GMT
2022-01-13 12:18:04.641 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] keep-alive: timeout=60
2022-01-13 12:18:04.641 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] transfer-encoding: chunked
2022-01-13 12:18:04.641 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] 
2022-01-13 12:18:04.641 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] {
     "msg":"success","code":0,"orders":[{
     "id":1,"userId":"1","commodityCode":"1","count":1,"amount":1}]}
2022-01-13 12:18:04.641 DEBUG 79432 --- [nio-8055-exec-1] feigndemo.feign.OrderFeignService        : [OrderFeignService#findOrderByUserId] <--- END HTTP (100-byte body)

服务提供者拦截器

当消费者调用这个服务提供者的时候,拦截器就可以在这里获取到header的token信息了.

@Slf4j
public class AuthInterceptor implements HandlerInterceptor {
     
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
     
        boolean flag = true;
        // 简单的认证逻辑  从请求头中获取Authorization
        String authorization = request.getHeader("Authorization");
        log.info("=========Authorization:"+authorization);
        if (StringUtils.isEmpty(authorization)){
     
            // 从请求参数中获取access_token
            String access_token = request.getParameter("access_token");
            if(StringUtils.isEmpty(access_token)){
     
                flag = false;
            }
        }
        return flag;
    }
}

代码地址

代码出自图灵学院, 我自己学完了做完作业又改造了一下.

https://gitee.com/zjj19941/ZJJ_Neaten5.10/tree/master/ZJJ_Feign/feign-interceptor

先执行sql脚本,自己准备一个nacos服务,然后修改配置文件配置,
最后,启动 com.order.MallOrderApplication 和 feigndemo.MallUserFeignDemoApplication
然后postman发起get请求: localhost:8055/user/findOrderByUserId/1
就能看到效果了

补充:可以在yml中配置

feign:
  client:
    config:
      mall-order:  #对应微服务
        requestInterceptors[0]:  #配置拦截器
          feigndemo.interceptor.FeignAuthRequestInterceptor

作者:张俊杰1994
来源链接:https://blog.csdn.net/qq_41489540/article/details/122471338

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68829.html

标签: Feign
分享给朋友:

“feign拦截器” 的相关文章

Error creating bean with name 'com.cloud.feign.interfaces.xxxFeignClient': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalSt.PathVariable annotation was empty on

环境:   Spring Cloud:Finchley.M8   Spring Boot:2.0.0.RELEASE   报错信息:    Error creating bean with name 'com.cloud.feig...

No fallback instance of type class  found for feign client user-service(转)

No fallback instance of type class found for feign client user-service(转)

1、错误日志 在 feign 开启熔断,配置 fallback 类,实现当前接口的实现类时,报错信息如下: Error starting ApplicationContext. To display the conditions report re-run you...

feignclient 添加cookie携带sessionId登录

Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参数 template ,该参数类型为 RequestTemplate,我们可以根...

SpringCloud系列——Feign 服务调用

SpringCloud系列——Feign 服务调用

  前言   前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调用。   Feign是一个声明性web服务客户端。它使编写web服...

45、nacos集成openfeign

45、nacos集成openfeign

nacos集成openfeign 一、创建服务提供者项目-nacos-producer 二、添加服务消费者项目-nacos-openfeign...

SpringCloud 中集成Sentinel+Feign实现服务熔断降级

SpringCloud 中集成Sentinel+Feign实现服务熔断降级

Sentine 1.背景 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。这里大家可能会问:Sentinel 和之前常用的熔断降级库 Netf...

SpringCloud和Dubbo的区别及Dubbo和Feign远程调用的差异

SpringCloud和Dubbo的区别 SpringCloud和Dubbo有什么区别? 两者都是现在主流的微服务框架,但却存在不少差异: 初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是...

关于本次【Unsatisfied dependency expressed through field 'iClientFeignEmployeeService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.oppo】

关于本次springboot项目上线遇到的问题归纳: 1.本地合适但是线上扫不到包,报错:【Unsatisfied dependency expressed through field 'iClientFeignEmployeeService'; nested exception...

SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)使用详解

SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)使用详解

前言 本篇主要介绍的是SpringCloud中的服务消费者(Feign)和负载均衡(Ribbon)功能的实现以及使用Feign结合Ribbon实现负载均衡。 SpringCloud Feign Feign 介绍 Feign是一个声明式的Web Serv...

SpringCloud Feign重试详解

SpringCloud Feign重试详解

摘要: 今天在生产环境发生了数据库进程卡死的现象,除了sql因为全量更新,没加索引的原因,最主要还是我们的接口的服务器端接口出现问题了。忽视了更新接口的幂等性,以及调用方feign client的重试,导致接口重复执行。万幸的是数据已经修复,花了几个小时跟踪feign和ribbon的源...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。