解决新版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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iOS结合导航控制器和标签栏控制器

    iOS结合导航控制器和标签栏控制器

    2022年1月14日
    44
  • Java基础算法详解

    Java基础算法详解查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排序可能会…

    2022年7月8日
    18
  • PL/SQL 游标变量

    PL/SQL 游标变量

    2021年8月19日
    75
  • C#下怎样处理并保存单色格式PNG图片?

    C#下怎样处理并保存单色格式PNG图片?  用微软自带的画图,打开一个已经存在的单色PNG图片文件,然后复制图像粘贴上去,做点反色或其他处理再保存,可以得到黑白单色PNG图片;但是,如果有很多黑底白字的图片要想改成白纸黑字的单色PNG格式保存这就很麻烦了,譬如2,3百张BMP或JPG图片用来保存只有白纸黑字的书页真是浪费。可是,有些索引格式图像如单色位图,或者单色PNG,如果用C#的Graphics类处理之后,保存文件只能得

    2022年7月21日
    14
  • 2022年Web前端入门的自学路线[通俗易懂]

    2022年Web前端入门的自学路线[通俗易懂]新手入门前端,需要学习的基础内容有很多。

    2022年7月3日
    39
  • easymock单元测试(控制测试)

    本文转自:点击打开链接测试驱动开发是软件开发的重要部分。如果代码不进行测试,就是不可靠的。所有代码都必须测试,而且理想情况下应该在编写代码之前编写测试。但是,有些东西容易测试,有些东西不容易。如果要编写一个代表货币值的简单的类,那么很容易测试把$1.23和$2.8相加是否能够得出$4.03,而不是$3.03或$4.029999998。测试是否不会出现$

    2022年4月12日
    54

发表回复

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

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