Feign的异步调用或者MQ调用与Security的问题处理;

1 package com.*.server.order.config;
  2
  3 import com.*.common.core.utils.*Util;
  4 import com.*.common.core.utils.StringUtils;
  5 import com.*.common.redis.service.RedisService;
  6 import com.*.common.security.starter.configure.*CloudResourceServerConfigure;
  7 import com.*.common.security.starter.properties.*CloudSecurityProperties;
  8 import feign.RequestInterceptor;
  9 import feign.RequestTemplate;
 10 import lombok.extern.slf4j.Slf4j;
 11 import org.springframework.beans.factory.annotation.Autowired;
 12 import org.springframework.context.annotation.Configuration;
 13 import org.springframework.core.annotation.Order;
 14 import org.springframework.util.AntPathMatcher;
 15 import org.springframework.util.ObjectUtils;
 16
 17 import java.lang.reflect.Field;
 18 import java.util.*;
 19 import java.util.concurrent.atomic.AtomicBoolean;
 20
 21 /**
 22  * 功能描述:Feign调用异常
 23  *
 24  * @author 唐泽齐
 25  */
 26 @Slf4j
 27 @Configuration
 28 @Order(Integer.MAX_VALUE)
 29 public class FeignConfiguration implements RequestInterceptor {
 30
 31     @Autowired
 32     private RedisService redisService;
 33     private static String[] patterns;
 34
 35     @Autowired
 36     public void init(*CloudResourceServerConfigure *CloudResourceServerConfigure) {
 37         try {
 38             log.warn("初始化FeignConfiguration");
 39             Field field = *CloudResourceServerConfigure.class.getDeclaredField("properties");
 40             field.setAccessible(true);
 41             *CloudSecurityProperties properties = (*CloudSecurityProperties) field.get(*CloudResourceServerConfigure);
 42             patterns = properties.getAnonUris().split(",");
 43         } catch (Exception e) {
 44             patterns = new String[]{};
 45         }
 46     }
 47
 48     @Override
 49     public void apply(RequestTemplate template) {
 50         Map> headers = template.headers();
 51         String currentTokenValue = *Util.getCurrentTokenValue();
 52         if (StringUtils.isEmpty(currentTokenValue) && !checkLogin(template.url())) {
 53             log.info("为" + template.url() + "填充Token:" + redisService.get("admin_token"));
 54             template.header("Authorization", "bearer " + redisService.get("admin_token"));
 55             template.header("GatewayToken", Collections.singleton("bGVjaHVhbmc6Z2F0ZXdheToxMjM0NTY="));
 56         }
 57     }
 58
 59     //判断当前请求是否本身就不需要登录
 60     private boolean checkLogin(String uri) {
 61         if (ObjectUtils.isEmpty(patterns)) {
 62             return false;
 63         }
 64
 65         //创建uri新对象
 66         String finalUri = uri + "";
 67         //补充 "/"
 68         if (!uri.startsWith("/")) {
 69             finalUri += "/";
 70         }
 71         // 过滤 "?"之后的
 72         if (uri.indexOf("?") >= 0) {
 73             finalUri = finalUri.substring(0, finalUri.indexOf("?"));
 74         }
 75         // 原子化 返回结果
 76         AtomicBoolean mustLogin = new AtomicBoolean(false);
 77         String finalUri1 = finalUri;
 78         // 另开 方法,增加 逃逸度
 79         Arrays.stream(patterns).forEach(p -> {
 80             //使用 AntPathMatcher 检查
 81             if (new AntPathMatcher().match(p, uri)) {
 82                 mustLogin.set(true);
 83                 return;
 84             }
 85 //                //自己写检验方法
 86 //                if(!doCheck(p,finalUri1)) {
 87 //                    mustLogin.set(true);
 88 //                    return;
 89 //                };
 90         });
 91         return mustLogin.get();
 92     }
 93
 94     private boolean doCheck(String check, String uri) {
 95         //是否忽略登录
 96         boolean result = true;
 97         try {
 98             Iterator ic = Arrays.stream(check.split("/")).iterator();
 99             Iterator iu = Arrays.stream(uri.split("/")).iterator();
100             for (; ic.hasNext(); ) {
101                 if (!iu.hasNext()) {
102                     result = false;
103                     break;
104                 }
105                 String c = ic.next();
106                 String u = iu.next();
107                 // 处理 /**
108                 if (c.equals("**") && !ic.hasNext()) {
109                     result = true;
110                     break;
111                 }
112                 // 处理 /*
113                 if (c.equals("*") && !ic.hasNext() && !iu.hasNext()) {
114                     result = true;
115                     break;
116                 }
117                 // 处理 /**/
118                 if (c.equals("**") && ic.hasNext() && iu.hasNext()) {
119                     String nextp = ic.next();
120                     while (iu.hasNext()) {
121                         if (nextp.equals(iu.next())) {
122                             break;
123                         }
124                     }
125                     continue;
126                 }
127                 //处理 /*/
128                 if (c.equals("*") && ic.hasNext() && iu.hasNext()) {
129                     continue;
130                 }
131                 if (!c.equals(u)) {
132                     result = false;
133                     break;
134                 }
135             }
136         } catch (Exception e) {
137             log.warn("检查异常,过滤当前规则。check:" + check + " ===> uri:" + uri, e);
138             result = false;
139         }
140         return result;
141     }
142
143 }

Original: https://www.cnblogs.com/tangzeqi/p/15075345.html
Author: instr
Title: Feign的异步调用或者MQ调用与Security的问题处理;

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574731/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 校招总结

    第一次出去校招,面试比想象中困难。按理说之前面试经验不少,不该有什么问题,但校招和平时面试确实不一样,平时面试一天就面一两个,时间不是问题,聊一两个小时都可以,校招一天要面十多个,…

    Java 2023年6月16日
    065
  • java 驼峰字符和下划线字符相互转换工具类

    public static final char UNDERLINE=’_’; public static String camelToUnderline(String param…

    Java 2023年5月29日
    080
  • 七牛云 融合CDN测试域名 -> 融合CDN加速域名

    七牛云 融合CDN测试域名 -> 融合CDN加速域名 本篇主要讲解 如何将七牛云融合CDN测试域名 切换到自定义的加速域名上去, 为什么会写这篇是因为我收到了一封 【七牛云】…

    Java 2023年6月9日
    085
  • C9800配置Session timeout和Idle timeout

    对客户端会话时间的修改通常发生在客户端会话超时时。一般客户会话超时,在logging中可以看到类似如下的log YYYY/DD/MM HH:MM:SS.xxx {wncd_x_R0…

    Java 2023年5月30日
    0115
  • Effective Java 第三版——75. 在详细信息中包含失败捕获信息

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    086
  • HM2022ssm-mp5【MP代码生成器】

    代码生成器原理分析 1.1 造句: 我们可以往空白内容进行填词造句,比如: 在比如: 再有: 1.2 观察我们之前写的代码,会发现其中也会有很多重复内容,比如: 那我们就想,如果我…

    Java 2023年6月5日
    091
  • 【Redis】简单动态字符串SDS

    C语言字符串 char *str = "redis"; // 可以不显式的添加\0,由编译器添加 char *str = "redis\0"…

    Java 2023年6月8日
    0104
  • zookeeper篇-watch命令

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 每个路径节点都有一个watcher监控,当该节点数…

    Java 2023年6月8日
    093
  • 数据分析网址

    数据可视化工具 百度ECharts http://echarts.baidu.com/ Cytoscape http://www.cytoscape.org/ 图表秀 http:/…

    Java 2023年6月15日
    067
  • 并发基础篇(六):线程Thread类的start()方法和run()方法

    https://blog.csdn.net/sihai12345/category_7623860.html 一、初识java的线程是通过java.lang.Thread类来实现的…

    Java 2023年5月30日
    072
  • 123取反操作为什么是-124 取反操作

    首先请记住一点,在计算机中所有的二进制都是以补码的形式存储的,所以你最后取反之后只是这个数的补码,你还需要转换成源码,才是我们最终的十进制数字 下面是计算过程: 正数取反(123,…

    Java 2023年6月6日
    0116
  • ucore操作系统学习(三) ucore lab3虚拟内存管理分析

    ucore lab3介绍 虚拟内存介绍 在目前的硬件体系结构中,程序要想在计算机中运行,必须先加载至物理主存中。在支持多道程序运行的系统上,我们想要让包括操作系统内核在内的各种程序…

    Java 2023年6月8日
    077
  • 栈和队列

    写在前面 栈和队列,也属于线性表,因为它们也都用于存储逻辑关系为 “一对一” 的数据。使用栈结构存储数据,讲究 先进后出,即最先进栈的数据,最后出栈;使用队…

    Java 2023年6月5日
    063
  • Spring为list集合和map集合类型赋值

    1.通过List标签在property标签中直接进行赋值 2.通过配置一个list集合类型的bean,需要使用util的约束(直接写,可以自动导入) 然后再通过id引用该list集…

    Java 2023年6月16日
    094
  • java WebSocket 即时通讯服务端代码

    ackage org.fh.plugins.ChatServer; import java.net.InetSocketAddress; import java.net.Unkno…

    Java 2023年6月8日
    083
  • List实体中不同字段值的转换

    //将sql查询出的List Original: https://www.cnblogs.com/gjths/p/14179140.htmlAuthor: ExpectoPatro…

    Java 2023年6月13日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球