Spring Boot 应用程序具有 REST 服务,可在 Spring Controller 中设置 cookie 值,然后使用 HttpServletResponse
将 cookie 发送到响应中的客户端,如下所示:
response.addCookie(new Cookie("AUTH1", "no"));
但是当我关闭 firefox,然后重新打开 firefox 并再次调用应用程序的 url 时,cookie 值完全相同。 如何确保浏览器关闭时 cookie 值被销毁,以便浏览器重新打开时 cookie 不存在?这可以在 Spring Boot 应用程序中配置吗?还是需要在前端应用中配置?
持续的努力:
将后端 REST Controller 中的所有 response.setCookie()
行更改为相同键值对的 session.setAttribute()
行不会产生任何AngularJS 客户端应用程序可以使用 $cookies.get('keyname')
进行读取,即使它们是相同的键名。 有没有办法在 Spring Controller 中设置在用户关闭浏览器时自动销毁的 session cookie?
我也尝试过用一个方法来实现@shazin
的建议(因为cookie在 Controller 类中被重新创建了很多次),但问题只是部分解决了。具体来说,我采取了以下步骤:
1.) 我开始时打开了几个浏览器窗口,其中只有一个包含正在测试的应用程序。
2.) 我更改了所有代码,如下所示,
3.) 然后我用 control-C 杀死了应用程序,也杀死了在端口上运行的进程。
4.) 然后我mvn clean package
5.) 然后我使用 java -jar jarname
再次启动应用程序,并将其加载到新的 InPrivate 浏览器窗口中。
6.) 我使用注销方法删除任何可能在以前版本中残留的 cookie,
7.) 然后我使用 GUI 触发新的 cookie 定义,它按预期工作。
8.) 但随后我通过关闭包含正在测试的应用程序的浏览器窗口进行测试,然后重新打开一个新的浏览器窗口并再次导航到该站点,但是 cookie 值仍然存在,所以这种方法没有解决了问题。
9.) 最后,我关闭了两个打开的浏览器窗口(每个浏览器窗口都有自己打开的几个选项卡。关闭所有浏览器窗口后,我打开一个新的浏览器窗口,发现cookies已被删除。 因此,以下方法仅在您关闭所有打开的浏览器窗口而不仅仅是包含该应用程序的浏览器窗口时才有效。
这是我为实现@shazin 的建议而编写的方法:
public Cookie getTempCookie(String key, String val){
Cookie tempCookie = new Cookie(key, val);
tempCookie.setMaxAge(-1);
return tempCookie;
}
下面是我如何从 Controller 内的各种 url 模式处理程序调用方法:
response.addCookie(getTempCookie("AUTH1", "yes"));
当只有包含应用程序的窗口关闭时,我还能做些什么来删除 cookie?在目前的形式下,如果用户关闭浏览器窗口,仍然存在安全风险没有意识到另一个浏览器窗口仍然打开。
最佳答案
你可以做的是将 Cookie 的最大年龄设置为 -1,这将不会保留 cookie,并会在浏览器关闭时删除。
Cookie authCookie = new Cookie("AUTH1", "no");
authCookie.setMaxAge(-1);
response.addCookie(authCookie);
Max Age 的 Javadoc 说明如下
A negative value means that the cookie is not stored persistently and will be deleted when the Web browser exits. A zero value causes the cookie to be deleted.
关于java - 当浏览器关闭时,如何让 Spring 生成的 cookie 过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35305292/