首页 > 数据库 >后端跨域cookie问题与spring-session-data-redis

后端跨域cookie问题与spring-session-data-redis

时间:2024-05-15 14:19:53浏览次数:24  
标签:redis 跨域 spring 写入 域名 cookie test net cn

背景

1、后端统一接入了公司内部登录系统,登录后cookie信息在域名:test.net.cn下。
Set-Cookie:SESSION=09a2f617-66a0-4e02-b99f-130d83900321; Domain=test.net.cn; Path=/; HttpOnly; SameSite=Lax

2、当我们的系统接入到统一登录系统后,若访问域名为a.test.net.cn,则不会出现问题,因为在他的子域名下,cookie是共享的,当跳转到我们系统后

sessionid是不会重新生成的,没问题

3、当我们的系统接入到统一登录系统后,若访问域名为a.test.net.cn:2531,则就会出现问题,因为域名不同,请求到后端,框架会认为本次请求不是同一个会话,

所以会在a.test.net.cn下再次写入一个cookie携带sessionId(说明:cookie的写入,domain是自动过滤端口的)

 

解释:

后端什么时候会判断写入cookie了,requset.getSeesion().getAttribute("");这个方法就会写入,查看源码可知,request.getSession();这个方法,默认为:

若本次请求的host下没有sessionId,则判断为新的会话,会重新创建一个sessionId,并写入到响应头里去:

Set-Cookie:SESSION=09a2f617-66a0-4e02-b99f-130d83900321; Domain=test.net.cn; Path=/; HttpOnly; SameSite=Lax    

解决方案:

1、添加cookie写入值配置

import org.springframework.session.web.http.DefaultCookieSerializer;

public class NonWriteCookieSerializer extends DefaultCookieSerializer {

    @Override
    public void writeCookieValue(CookieValue cookieValue) {
    }
}

2、配置后端cookie配置


pattern: ^.+?\.(\w+\.\w+\.[a-z]+)$
 @Bean
    public DefaultCookieSerializer defaultCookieSerializer() {
        DefaultCookieSerializer cookieSerializer = new NonWriteCookieSerializer();
        cookieSerializer.setDomainNamePattern(pattern);
        cookieSerializer.setUseBase64Encoding(false);
        return cookieSerializer;
    }
注意:\的问题,直接写入到字符串里面为:

 

cookieSerializer.setDomainNamePattern("^.+?\\.(\\w+\\.\\w+\\.[a-z]+)$");
该正则表达式为任意域名,也就是和当前的cookie会话域名保持一致

 

3、设置request.getSession()方法,防止重复写入session

request.getSession(false).getAttribute(Constants.SESSION_ATTRIBUTE_USER);

这样可以防止重新创建sessionId,以及就算框架写入cookie其实值也是写不进去的,保证每次会话请求的sessionId与test.net.cn保持一致。

大功告成:这样就算登录的域名和子系统的域名不在同一个域名下,也可以通过spring-session-data-redis保持登录的统一性

建议:作为正式系统,还是建议各个子系统和登录系统在同一个域名下,这样才是最合规的

标签:redis,跨域,spring,写入,域名,cookie,test,net,cn
From: https://www.cnblogs.com/xzlnuli/p/18193794

相关文章

  • SpringBoot SpringCloud Spring Cloud Alibaba 版本对应关系
    最近公司的项目扫描出一些安全漏洞,于是让我给项目中的依赖升下级。有部分涉及到SpringBoot和SpringCloud,因此要考虑到兼容性,特此记录下查询各版本之间对应关系的方法。靠谱的方法还是要从官网得到,参考文章:工具篇--SpringBoot与SpringCloud的版本对应关系&SpringBoot与JDK对应关系......
  • tui-image-editor中跨域问题
    如何安装tui-image-editor等就不再赘述,参考这篇博客即可,https://blog.csdn.net/weixin_44867717/article/details/128212251简单版参考:https://blog.csdn.net/Bonsoir777/article/details/134153807官网:https://ui.toast.com/tui-image-editor 下面说说我碰到的问题,跨域......
  • asp.net core 跨域
    missingalloworiginheaderasp.netcore在ASP.NETCore中,出现"missingalloworiginheader"错误通常是由于跨域资源共享(CORS)未正确配置所致。该错误的原因是客户端(如浏览器)尝试从不同的域或端口请求资源,而这些资源的访问被服务器限制。为了解决这个问题,你可以使......
  • .NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)
    .NET缓存里分了几类,主要学习内存缓存、分布式缓存一、内存缓存IMemoryCache#1、Program注入缓存builder.Services.AddMemoryCache();2、相关方法及参数Get、TryGetValue、GetOrCreate、GetOrCreateAsync、Set、Remove,关键参数是过期时间,GetOrCreate、GetOrCreateAsync是通......
  • RediSearch的简单使用与总结
    前言之前就有考虑过想要研究下RediSearch,号称高性能全文索引的功能,这几天闲来无事调研了一番。RediSearch介绍RediSearch是RedisLabs提供的一款强大且高效的搜索和全文索引引擎。它是一个基于Redis的模块,允许用户在Redis数据库中进行复杂的搜索和全文检索操作,而无需将......
  • springboot国际化的使用(一_验证OK
    https://blog.csdn.net/weixin_39960529/article/details/86571962 步骤:1.首先建立一个meven项目2.在pom.xml中加如下依赖:<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-thymeleaf</artifactI......
  • SpringBoot中使用MessageSource的getMessage获取i18n资源文件中的消息_OK
    https://www.cnblogs.com/badaoliumangqizhi/p/13608623.html 场景springboot默认就支持国际化的,而且不需要你过多的做什么配置,只需要在resources/下创建国际化配置文件即可,注意名称必须以messages开始。messages.properties(默认的语言配置文件,当找不到其他语言的配置的时候......
  • 影响Redis的因素
    两个重要概念Redis提供了两种不同的持久化机制来保证数据的持久存储:RDB(RedisDatabase)和AOF(AppendOnlyFile)。RDB持久化RDB持久化是通过创建数据集的快照(snapshot)来工作的。在指定的时间间隔内,Redis会创建一个数据集的内存镜像,并将它写入一个磁盘上的文件中(通常是一个.r......
  • 【JavaWeb】前后端分离SpringBoot项目快速排错指南
    1发起业务请求打开浏览器开发者工具,同时显示网络(Internet)和控制台(console)接着,清空控制台和网络的内容,如下图然后,点击你的业务按钮,发起请求。首先看控制台有没有报错信息,这是最直观的,看不懂英文就去翻译一下,百度一下如果控制台的信息并没有什么价值,或者指明是后端的问题,那么......
  • 2.Redis安装
    Redis安装Windows下安装下载地址:https://github.com/tporadowski/redis/releasesRedis支持32位和64位。这个需要根据你系统平台的实际情况选择,这里我们下载Redis-x64-xxx.zip压缩包到C盘。打开文件夹,内容如下:打开redis.windows.conf文件ctrl+f搜索maxmemory......