微服务使用openfeign调用单点的会话失效问题
项目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服务器的登录页

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

但是任意一个系统点了注销,所有系统都会被注销
微服务使用openfeign调用单点的会话失效问题的更多相关文章
- SpringCloud实战 | 第五篇:SpringCloud整合OpenFeign实现微服务之间的调用
一. 前言 微服务实战系列是基于开源微服务项目 有来商城youlai-mall 版本升级为背景来开展的,本篇则是讲述SpringCloud整合OpenFeign实现微服务之间的相互调用,有兴趣的朋友可 ...
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:6、微服务间的调用方式:Rpc.StartTaskAsync。
系统目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- JHipster技术栈定制 - 基于UAA的微服务之间安全调用
本文通过代码实例演示如何通过UAA实现微服务之间的安全调用. uaa: 身份认证服务,同时也作为被调用的资源服务.服务端口9999. microservice1: 调用uaa的消费者服务,服务端口80 ...
- SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
1.概念:Restful 基础架构 2.具体内容 对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为 了清 ...
- 微服务之间的调用(Ribbon与Feign)
来源:https://blog.csdn.net/jrn1012/article/details/77837658 使用Eureka作为服务注册中心,在服务启动后,各个微服务会将自己注册到Eureka ...
- Spring Cloud 微服务六:调用链跟踪Spring cloud sleuth +zipkin
前言:随着微服务系统的增加,服务之间的调用关系变得会非常复杂,这给运维以及排查问题带来了很大的麻烦,这时服务调用监控就显得非常重要了.spring cloud sleuth实现了对分布式服务的监控解决 ...
- net core 微服务框架 Viper 调用链路追踪
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- Spring cloud微服务安全实战-5-1单点登录基本架
基于微服务架构,前后端分离实现SSO 前后端分离到底是个什么样的架构. 中间不是用Nginx而是用Node JS. node.js在服务端的页面渲染,这样搜索引擎爬虫 来爬的时候 爬的就是html页面 ...
- 微服务 通过EnableFeignClients调用其他服务的api
今天在项目上遇到一个问题,通过当前service服务要调用到其他service服务的api接口时,可通过EnableFeignClients调用其他服务的api,大概的步骤如下: 1.在springb ...
随机推荐
- vue2中v-if 或者 v-show 使用数组中的值判断不生效
知识点来源:博客园==> 外号蓝大胖// 对象this.$set(obj, key, value)/vue.set(obj, key, value)// 数组this.$set(arr, ind ...
- Handler机制实现原理总结
Handler一般用于线程间通信,如常用的子线程使用handler让主线程更新UI.那么这是怎么实现的呢? 我们先把这个大问题分解成多个小问题: post();postDelayed();sendMe ...
- CF1817C Similar Polynomials
简要题意 给定两个次数为 \(d\) 的多项式 \(A, B\) 在 \(0, 1, 2, \dots, d\) 处的点值对 \(10^9+7\) 取模,保证 \(B(x) \equiv A(x+s) ...
- 通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)
毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,2023年业界巨头Google已经率 ...
- pta第三阶段题目集
(1)前言 pta第三阶段作业中,主要包含了如下的主要内容: 1.全程贯穿了课程设计的程序,每一次都是上一次的迭代和修改,难度较大,中间涉及到先是类与类之间的多态和继承关系,后面的修改中,转变为了组合 ...
- PowerBuilder从入坑到放弃(二)编码规范
前言 上一篇我们从0到1用pb开发了一个helloworld程序,并成功将开发的程序编译打包并且制作了安装包. 程序员最讨厌的莫过于写文档和别人不写注释. 不知道大家会不会和我一样,在找bug时,有段 ...
- Python中使用支付宝支付
准备 # 支付宝文档 https://opendocs.alipay.com/open/270/105898?pathHash=b3b2b667 # 在沙箱环境下实名认证 https://openho ...
- 曲线艺术编程 coding curves 第十四章 其它曲线(Miscellaneous Curves)
第十四章 其它曲线(Miscellaneous Curves) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ ...
- 前端Vue组件之仿京东拼多多领取优惠券弹出框popup 可用于电商商品详情领券场景使用
随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身.通过组件化开发,可以有效 ...
- 零基础实现Java直播(二):实现流程
一.前提条件 在实现Java直播前,请确保: 已在项目中集成 ZEGO Express SDK,详情请参考 快速开始 - 集成. 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 App ...