有关cookie总是无法立即清除的原因

本文解决了一个常见的单点登录场景下的问题:如何彻底清除带有特定domain和path设置的cookie。通过详细记录作者在Spring Security项目中遇到的问题及解决过程,帮助读者理解cookie的工作原理并提供实用的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有关cookie总是无法立即清除的原因

项目用到springsecurity2.0;目的是权限管理和点单登录。

有关cookie的当然是单点登录了。

我们自己实现的单点登录,是写入过滤器,然后将用户信息和认证信息填写到cookie中,这时候填写了此cookie的domain和path;

而在没有勾选rememberme的情况下是可以实现退出之后转回登录界面的。然后我填写了勾选rememberme之后将cookie的时间设置为两周。但是发现退出之后无法清除cookie,我在退出方法中填写了如下代码:
Cookie cookie = new Cookie("ssoAuthor", null);
cookie.setMaxAge(0);
这两段代码是从其他的博客里面看到的。发现并不好用,可能是他们没有自己验证就转载了吧。

然后我发现首先缺少了response.addCookie(cookie);

添加之后发现依旧无法删除,搞得我头都大了,找了一天多,最后发现,是代码写的有问题,因为cookie是分域和path的。所以直接new的一个名字相同的cookie不一定可以替换掉原来的cookie。所以只能将之前的域和path加上。实现如下:

Cookie cookie = new Cookie("ssoAuthor", null);
cookie.setMaxAge(0);
cookie.setDomain(cookieDomain);
cookie.setPath(cookiePath);
response.addCookie(cookie);

这样才真正的将之前的cookie清除了。。。


<think>嗯,用户问的是cookie存储的数据在打开窗口时被清除原因。首先,我需要回忆一下cookie的工作原理和相关设置。Cookie的作用域主要由domain和path决定,而它们的生命周期由expires或max-age属性控制。如果用户在打开新窗口或标签时发现cookie清除,可能有几个原因。 首先,可能cookie没有设置过期时间,导致它成为会话cookie,只在浏览器会话期间存在。当用户关闭浏览器时,会话结束,这些cookie会被删除。但如果用户只是打开新窗口,通常会话仍然持续,所以这可能不是主要原因,除非浏览器设置或扩展程序干预。 然后,跨域问题。如果cookie的domain或path设置不正确,新窗口可能无法访问原有的cookie。例如,如果cookie的domain设置为子域名,而新窗口打开的是主域名,或者使用了不同的协议(如HTTP和HTTPS),这时候cookie可能不会被携带。 另外,浏览器的隐私设置也可能影响。比如用户开启了无痕模式,或者设置了关闭浏览器时清除数据,这时候新窗口如果是无痕窗口的话,自然不会有之前的cookie。 还有可能是SameSite属性设置的问题。如果cookie设置了SameSite=Lax或Strict,跨站点请求时可能不会发送cookie,尤其是在新窗口中打开不同站点的页面,导致cookie未被携带。 代码示例方面,需要展示如何正确设置cookie的domain、path和过期时间,确保其持久性和正确的域作用域。比如设置expires为未来的日期,指定domain为主域名,这样所有子域名都能访问。 相关问题需要围绕cookie的作用域、属性、生命周期以及与localStorage的区别等方面展开,这样可以帮助用户更全面地理解问题。</think><< Cookie存储的数据在新窗口中被清除原因通常与以下几个因素有关: 1. **会话Cookie未设置过期时间**: ```javascript // 错误写法:未设置expires的会话cookie document.cookie = "temp=123"; // 正确写法:设置过期时间的持久cookie document.cookie = "persistent=456; expires=Fri, 31 Dec 2024 23:59:59 GMT"; ``` 当cookie未设置`expires`或`max-age`属性时,它会被视为会话cookie,关闭浏览器即失效。某些浏览器实现中,新窗口可能被视为新会话。 2. **域名/路径不匹配**: ```javascript // 子域名cookie设置 document.cookie = "sub=value; domain=sub.example.com"; // 主域名访问时无法读取该cookie ``` 如果cookie设置的domain/path与新窗口访问的地址不匹配,浏览器不会携带该cookie。需要确保domain设置为顶级域名(如`.example.com`)才能跨子域共享。 3. **安全设置冲突**: ```javascript // HTTPS专用cookie document.cookie = "secure_cookie=abc; Secure"; // HTTP页面无法读取 ``` 当新窗口使用不同协议(HTTP/HTTPS)或端口时,设置了Secure或指定端口的cookie将不可用。 4. **浏览器隐私设置**: 用户启用了"关闭浏览器时清除cookie"选项,或使用隐私模式(无痕窗口),此时所有会话cookie都会被立即清除。 5. **SameSite属性限制**: ```javascript // 严格模式的SameSite设置 document.cookie = "samesite=strict; SameSite=Strict"; ``` 当设置为`SameSite=Strict`时,跨窗口打开的请求不会携带cookie,需要设置为`SameSite=Lax`或`None`(需配合Secure)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值