首页 > 其他分享 >微服务使用openfeign调用单点的会话失效问题

微服务使用openfeign调用单点的会话失效问题

时间:2023-05-19 19:35:53浏览次数:33  
标签:调用 单点 openfeign 登录 Fegin token 失效 Sa

项目Springcloud,认证中心方式实现SSO使用开源框架Sa-Token

本身的单独访问每个客户端服务的单点就没有问题。然后单点通过Fegin调用就不好使了!

主要使用的Sa-Token的微服务单点功能
使用的依赖如下
  <!--SA-Token SSO-->
    <dependencyManagement>
        <dependencies>
            <!-- Sa-Token 权限认证, 在线文档:https://sa-token.cc -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-spring-boot-starter</artifactId>
                <version>1.33.0</version>
            </dependency>
            <!-- Sa-Token 插件:整合SSO -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-sso</artifactId>
                <version>1.33.0</version>
            </dependency>

            <!-- Sa-Token 整合redis (使用jackson序列化方式) -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-dao-redis-jackson</artifactId>
                <version>1.33.0</version>
            </dependency>

            <!-- Sa-Token插件:权限缓存与业务缓存分离 -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-alone-redis</artifactId>
                <version>1.33.0</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

问题就是A服务通过Fegin调用B服务,然后 StpUtil.isLogin();是False

统一的认证处理拦截器

/**
 * @description: SA-Token 认证中心登录状态校验拦截器
 * @author: GuoTong
 * @createTime: 2022-10-05 15:40
 * @since JDK 1.8 OR 11
 **/
public class AuthenticationInterceptor implements HandlerInterceptor {
    /**
     * Description:  主要流程:
     * <p>
     * 1.从 http 请求头中取出 token,
     * 2.判断是否映射到方法
     * 3.检查是否有SkipTokenByJWT注解注释,有则跳过认证
     * 4.检查有没有需要用户登录的注解NeedTokenByJWT,有则需要取出并验证
     * 5.认证通过则可以访问,不通过会报相关错误信息
     */

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
        // 如果不是映射到方法直接通过
        if (!(object instanceof HandlerMethod)) {
            return true;
        }
        String requestURI = httpServletRequest.getRequestURI();
        // 判断是否是认证中心对外认证接口
        if (requestURI.contains("/sso")) {
            return true;
        }
        //  获取当前会话是否已经登录,返回true=已登录,false=未登录 ||只能获取本服务的登录状态 StpUtil.isLogin
        boolean login = StpUtil.isLogin();
        if (!login) {
            // 跳转认证中心 httpServletResponse.sendRedirect("/sso/login?back=" + httpServletRequest.getRequestURL());
            throw new NotLoginException(ContextCommonMsg.LOGIN_STATUS_EXPIRE);
        }
        return true;
    }
}

明明都已经登录了Sa-Token集成的OSSServer服务器

但是Fegin调用过程中,发现请求老是被拦截去重定向到SSO-server的登录页

按下F12看看Sa-token在浏览器上做了啥。已经登录的系统Sa-token会放一个Cookie,且所有集成于Sa-token的应用,访问的时候都会放这个玩意。所有集成Sa-token的SSo-Server的客户端的Cookie完全一致,达到单点登录目的。

但是Fegin调用为什么不通,难道这个Cookie没有带过去。

于是就拦截Fegin发送请求的Request,鞋带上Cookie在Request·的Header里

 @Bean
    public RequestInterceptor requestInterceptor() {
        return template -> {
            // 获取请求进入的数据
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

            if (requestAttributes != null) {
                // fegin调用前的原始请求
                HttpServletRequest request = requestAttributes.getRequest();
                if (request != null) {
                    String cookie = request.getHeader("Cookie");
                    // 添加cookie
                    template.header("Cookie", cookie);
                    // 添加Content-Type
                    String contentType = request.getContentType();
                    template.header("Content-Type", contentType);
                }
            }

        };
    }

本身的单独访问每个客户端服务的单点就没有问题。然后单点通过Fegin调用就好使了,;

未登录访问任何一个微服务系统都会被重定向到SSO服务器的登录页

image

登录完成后会重定向回来:Fegin调用不会走到SO服务器的登录页,获取到接口数据了

image

但是任意一个系统点了注销,所有系统都会被注销

标签:调用,单点,openfeign,登录,Fegin,token,失效,Sa
From: https://www.cnblogs.com/gtnotgod/p/17416084.html

相关文章

  • 本地事务失效问题描述及其解决方案
    什么情况下会出现本地事务失效的问题,为什么会出现本地事务失效问题? 在分布式架构中,本地事务失效的原因主要是在于分布式事务的实现难度和复杂度,需要在多个服务之间进行协调、通信和同步状态等,在特定的情况下,可能会出现延迟,中断或者失败的问题。 举一个简单的例子:如果在多个......
  • mysql 调优-索引失效
    范围条件放最后面,不管单列还是多列索引,把能过滤最多的索引放前面用不用索引最终都是优化器决定的,EXPLAINjson格式里的执行成本决定最左匹配,如果是联合索引,查找索引树的时候,只能根据第一个索引才能找到第二个第三个,如果顺序没对就不会走索引--联合索引(name,code,ad......
  • MYSQL因IN的范围太大导致索引失效问题
    背景最近发现有个用于统计的门店串码激活数量的SQL特别慢,将其摘出来大致如下SELECTa.sku_idasskuId,a.store_idasstoreId,count(*)assaleQtyFROMall_imei_infoawherea.activated_time>=1675530000000anda.activated_time<=1675616399999anda.stor......
  • 聊聊我认为的OpenFeign
    此篇文章不从源码角度解析,网上一搜一大把。我个人的习惯是自己评估与思考下大概的设计思路是什么,然后看源码与博客佐证。否则一来就是使用然后看源码,一坨一坨的代码,真的看的头疼。以上仅是个人的学习方法。聊聊OpenFeign,其实这个框架,之前用过,但没留意太多;说白了这个框架的出现就......
  • 几大索引失效原因
    1.带头大哥不能死这局经典语句是说创建索引要符合最左侧原则。例如表结构为u_id,u_name,u_age,u_sex,u_phone,u_time创建索引为idx_user_name_age_sex。查询条件必须带上u_name这一列。2.不在索引列上做任何操作不在索引列上做任何计算、函数、自动或者手动的类型转换,否则会进行全表扫......
  • '\t'引起的bug导致if语句失效
    用了多半天的时间终于领教了这个'\t'的厉害,今天的代码中一个if语句总是不起作用,怎么找怎么改,都无效,最后终于发现原来if条件里的字符串需要首尾加上'\t',才能和数据匹配上,因为我的数组是用EXCEL制作,直接拷过来的,表面上是看不见制表符'\t'的,多亏我从控制台打印了一下数组,......
  • 基于轨迹预测的驾驶员方向控制方法实现的单点预瞄,通过carsim与simulink仿真发现,该方法
    基于轨迹预测的驾驶员方向控制方法实现的单点预瞄,通过carsim与simulink仿真发现,该方法能够良好的实现车俩的轨迹跟踪控制。有对应信息和文件说明。ID:23100684398458311......
  • springcache + redis 配置支持缓存ttl失效
    packagetst;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.JsonTypeInfo;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.......
  • flex 嵌套下 overflow: hidden 失效
    HTML结构<divclass="container"><divclass="header">header</div><divclass="main"><divclass="left">left</div><divclass="center">......
  • 日常踩坑_idea一些失效的快捷键
    背景提要开开心心,今天新升级了IDEA2023,用上了新的UI,看起来真简洁干净漂亮但是呢,放到远端以后,好几个快捷键都用不了了解决当然是先上解决方案ctrl+shift+f全局搜索不能使用,可能是与windows中切换输入法的快捷键冲突了关掉hotkeyctrl+alt+方向键代码前进后退不能动,试试......