解决新版chrome跨域问题:cookie丢失以及samesite属性问题「建议收藏」

解决新版chrome跨域问题:cookie丢失以及samesite属性问题「建议收藏」最近在使用前后端分离开发的时候,遇到了一个诡异的问题,无论如何设置跨域,同一个页面获取到的session始终不一致。发现问题:登录界面前后端分离,ajax提交登录时出错验证码接口和登录接口的session不一致(跨域问题)在网上搜索跨域问题,重新设置,问题依旧错因排除:ajax允许cookie(已经设置xhrFields:{withCredentials:true})springboot尝试设置了多种跨域方法(springboot解决跨域)深入分析:使用其它浏览器(fi

大家好,又见面了,我是你们的朋友全栈君。

最近在使用前后端分离开发的时候,遇到了一个诡异的问题,无论如何设置跨域,同一个页面获取到的session始终不一致。

发现问题:

登录界面前后端分离,ajax提交登录时出错
验证码接口和登录接口的session不一致(跨域问题)
在网上搜索跨域问题,重新设置,问题依旧

错因排除:

ajax允许cookie(已经设置 xhrFields: { withCredentials: true} )
springboot尝试设置了多种跨域方法(springboot解决跨域)

深入分析:

使用其它浏览器(firefox, ie),session却是一致的

对比chrome和firefox请求头和响应头:

firefox:首次发起请求后,服务端返回sessionId后,之后每次请求中的cookie都会带上sessionId。
chrome:请求头始终未携带sessionId,甚至整个cookie都为空,导致服务器每次都接受不到sessionId,每次都会重新分配 一 个 session。

探寻解决方案:
在配置类中设置SameSite=null:

@Configuration
public class SpringSessionConfig { 
   
	@Bean
	public CookieSerializer httpSessionIdResolver() { 
   
		DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
		...
		cookieSerializer.setSameSite(null);
		...
	}
}

注意,你的项目如果未做session分布式管理,可能需要引入以下依赖才能使用上述类。至于不同Chrome版本号的问题可以参考这篇文章:关于解决Chrome新版本中cookie跨域携带和samesite的问题处理

<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-core -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-core</artifactId>
    <version>2.1.4.RELEASE</version>
</dependency>

最终解决方案:
继续查找资料的时候,幸运的找到了github上对于该问题的探究:New cross-site cookie not ‘SameSite’ warning in Chrome

看到其中的一条解决方案: 禁用chrome samesite。方法如下:
1.在chrome中打开链接: chrome://flags/#site-isolation-trial-opt-out,搜索samesite
在这里插入图片描述

2.将上述三个选项禁用(设为disable)后重启chrome,问题解决
在这里插入图片描述
总结:
存在即合理,SameSite的设计初衷是为了防止CSRF攻击,禁用SameSite实际上并没有解决问题,属于下下策。这里提供一下我的理解,SameSite为了防止CSRF攻击,加强了对cookie的管理,防止用户带着cookie去访问第三方网站,而这又涉及到了跨域问题。然而,我们不可能要求用户像我们一样去禁用新版chrome的SameSite,目前的建议就是在header中设置samesite,即上述的response.setHeader("Set-Cookie", "HttpOnly;Secure;SameSite=None")后,使用https传输cookie。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133162.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月9日 下午5:36
下一篇 2022年6月9日 下午5:46


相关推荐

  • Badboy自动化测试工具7 读取Excel

    Badboy自动化测试工具7 读取Excel

    2022年3月12日
    62
  • 创建软RAID5阵列

    创建软RAID5阵列centos7 部署 raid5 阵列前言 实验环境系统 Linxucentos7 内存 硬盘 20GB 系统盘一块 3 块 5GB 拓展硬盘 目的 用 4 块硬盘在 centos7 系统中模拟软 Radi5 磁盘阵列 当其中一块盘坏掉 保证生产正常运行 一 什么是磁盘阵列二 安装磁盘阵列三 模拟磁盘坏掉四 总结

    2026年3月17日
    2
  • 带记忆化搜索的斐波那契数列

    带记忆化搜索的斐波那契数列带记忆化搜索的斐波那契数列//通过dp数组保留部分结果,动态规划避免大量重复性操作#include#include#includeusingnamespacestd;constintMAXN=100;intdp[MAXN];intfabnaci(intn){if(n==1||n==2){

    2022年7月26日
    9
  • netty bytebuffer_计算系统基础答案详解

    netty bytebuffer_计算系统基础答案详解1.ByteBuf与NIO中的ByteBuffer类似,Netty中以ByteBuf作为它的字节容器。ByteBuf相当于ByteBuffer的升级。有兴趣可以看一看&amp;amp;amp;amp;gt;&amp;amp;amp;amp;gt;之前NIO中的ByteBuffer的文章ByteBuf维护了两个不同的索引:一个用于读取,一个用于写入。读取时,读索引hi递增读取的字节数。写入时,写索引会递增写入的字节数。初始时两个索引都为0。当两个索引…

    2025年11月27日
    3
  • _bz2 缺少

    _bz2 缺少报错信息from_bz2importBZ2Compressor,BZ2DecompressorModuleNotFoundError:Nomodulenamed’_bz2’解决办法1、安装yuminstallbzip2-devel2、找到_bz2.cpython-37m-x86_64-linux-gnu.so文件如果在机器上没有的话,…

    2022年5月12日
    126
  • 英文翻译插件介绍_好用的翻译插件

    英文翻译插件介绍_好用的翻译插件明确需求开发一款插件最先要考虑的当然是它要实现什么功能了。比如我想做的是varname-go-die主要功能就是让开发者有时候遇到起变量名但是不知道英文怎么拼时,不需要切换到翻译软件去查找再copy

    2022年8月1日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号