spring-session-core导致的接口调用问题,排查记录

简介: spring-session-core导致的接口调用问题,排查记录

问题出现

最近需要开发几个open接口,给其他端用,所以是不需要进行是否登录的鉴权的,用户管理那边提供的框架也留了口子,可以通过设置排除链接来不鉴权,比如排除掉所有/openapi/*的接口调用。

但是有一个问题,配置好之后,使用postman来调用,第一次调用正常,之后再调用在postman那看,好像啥也没返回,从代码这边看,是因为鉴权没通过所以跳404,就很奇怪,我一开始用的chrome的插件版postman,折腾半天搞不定啊,后来我把插件卸载再重新安装,就又能调通一次。但是因为插件版的很多设置找不到入口,所以我又安装了软件版的postman,发现每次调用完之后,接口返回值会在cookie中设置一个SESSION=XXXXX之类的东西,然后postman就会把这个东西存在cookie中,下次调用发给后端,后端会拿这个东西去查权限,一查查不到,就报错了,

简单解决

知道了表现,可以针对这个表现先简单解决一下,是的,就是每次调用完接口就手动删除一次cookie中的session,就这么用了几天,后来觉得太麻烦了,就想看下是哪里在设置,是不是能从根本上解决问题。

排查

已知:

  • 系统里获取用户的方式,是从session中取用户
  • cookie中设置的对象是SESSION作为key的

所以我怀疑这是SSO那边搞的,而且表现是cookie中设置了东西,我想的是把我这几个open接口的cookie清除一下

第一步:清除cookie法

因为我有一个处理所有open接口的controlleradvice,所以我就想能不能利用上,查了一下可以用利用@ControllerAdvice和ResponseBodyAdvice来处理,所以我写了一版,在beforeBodyWrite里将cookie中的SESSION删除,试了一下果然不行,而且我发现不管我的@ControllerAdvice的order设置多少都不行,所以这条路走不通,但是原因我好像还没找到,有懂的请评论告诉我吧。

第二步:查根本原因

我之所以一开始选择第一版,就是因为我不知道这个SESSION是啥时候设置的,所以我只能曲线救国,结果失败了,所以还是要直面这个问题,但是程序里引了那么多的包,我咋知道是哪里这么写了一句呢,我先把sso的包排查了一遍,没找到哪里设置cookie,也没找到设置session的地方,然后全局搜索“SESSION”,真的被我找到一个地方,有一个@Bean,是获取CookieSerializer的,里面有一句

defaultCookieSerializer.setCookieName("SESSION");

我试着改了一下这个cookiename里的内容,比如改成“SESSIONAAA”,接口返回的cookie里,果然也跟着变成了SESSIONAAA。然后看了一下,CookieSerializer属于spring-session-core包,有了目标就好说了。

第三步:排除接口

找到了具体包,我的第一反应肯定是查下有没有啥配置项,可以排除掉我的open接口的,尝试了这种方式:博客系统用户会话管理,亲测不行,还是设置SESSION,然后我询问了claude,他说可以重写CookieSerializer,不过我看了一下,项目中已经有了一个CookieSerializer的Bean,可以在这个基础上改。

解决

下面详细写一下解决方式:

首先自己写一个CookieSerializer继承默认的DefaultCookieSerializer

@Configuration
public class CustomCookieSerializer extends DefaultCookieSerializer {
  @Override
  public void writeCookieValue(Cookievalue cookievalue){  
  if(!(ServletRequestAttributes) (RequestontextHolder .currenteqvestAttributes()).getRequest).getRequestURI().startswith("/openapi/"){
      super.writeCookievalue(cookievalue):
      }
  }
}

然后通过自定义的那个Bean把咱们自定义的这个返回去。

@Bean
    public CookieSerializer cookieSerializer() {
        CustomCookieSerializer serializer = new CustomCookieSerializer();
        serializer.setCookieName("SESSION");
        serializer.setCookiePath("/");
        return serializer;
    }

然后就可以啦。

关联一下上一篇:spring-session-core排除某些接口不设置session

目录
相关文章
|
4月前
|
Arthas Java 测试技术
Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战
Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战
|
IDE Java 开发工具
深入Spring Boot: 怎样排查 java.lang.ArrayStoreException
java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.ArrayStoreException。
7500 0
|
4月前
|
安全 Java 测试技术
【工作中问题解决实践 九】Spring中事务传播的问题排查
【工作中问题解决实践 九】Spring中事务传播的问题排查
38 0
|
安全 IDE Java
Spring 新版本修复远程命令执行漏洞(CVE-2022-22965),墨菲安全开源工具可应急排查
Spring 新版本修复远程命令执行漏洞(CVE-2022-22965),墨菲安全开源工具可应急排查
Spring 新版本修复远程命令执行漏洞(CVE-2022-22965),墨菲安全开源工具可应急排查
|
Arthas Java 测试技术
深入Spring Boot:利用Arthas排查NoSuchMethodError
## 前言 有时spring boot应用会遇到`java.lang.NoSuchMethodError`的问题,下面以具体的demo来说明怎样利用[arthas](https://github.com/alibaba/arthas)来排查。 Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/dem
2638 0
|
IDE Java 开发工具
深入Spring Boot:怎样排查expected single matching bean but found 2的异常
写在前面 这个demo来说明怎么排查一个常见的spring expected single matching bean but found 2的异常。
6170 0
|
Java Spring
Spring错误排查(AOP)Exception in thread “main“ org.springframework.beans.factory.BeanCreationException
Spring错误排查(AOP)Exception in thread “main“ org.springframework.beans.factory.BeanCreationException
|
编解码 监控 NoSQL
疑案追踪:Spring Boot内存泄露排查记
疑案追踪:Spring Boot内存泄露排查记
721 0
疑案追踪:Spring Boot内存泄露排查记
|
Arthas Java 测试技术
【直播回顾】阿里专家断岭:当Spring Boot遇上Arthas—深入细节和排查问题的实践
使用Arthas深入Spring Boot的细节,并且排查Spring Boot问题的实践。
3798 0
|
Java API Maven
微服务实战之春云与刀客(二)—— Spring cloud 实现仿RPC面向接口调用方式
像HSF、dubbo这种RPC框架,客户端都是通过接口(Interface)调用服务的,无须自己拼装调用方式,客户端就像调用本地类方法一样。而spring cloud原生的客户端调用时通过RestTemplate发起Http调用请求,需要手动指定URL和参数,在使用上比较费劲,后来出现了申明式服务调用——Spring Cloud Feign,终于使调用得到了解放,而本文就是讲述如何极致地利用Feign来进行微服务开发。
5122 0