如何在浏览器关闭时让Spring生成的Cookie过期?

时间:2016-02-10 01:22:20

标签: java spring servlets spring-boot

Spring Boot应用程序具有REST服务,可在Spring Controller中设置cookie值,然后使用HttpServletResponse将cookie发送到响应中的客户端,如下所示:

response.addCookie(new Cookie("AUTH1", "no"));

但是当我关闭firefox,然后重新打开firefox并再次调用应用程序的URL时,cookie值完全相同。 如何确保在浏览器关闭时销毁cookie值,以便在重新打开browswer时cookie不存在?可以在Spring Boot应用程序中配置吗?或者我是否需要在前端应用程序中配置它?

正在进行的努力:

将相同键值对的后端REST控制器中的所有response.setCookie()行更改为session.setAttribute()行并不会产生AngularJS客户端应用程序可以使用$cookies.get('keyname')读取的任何内容,即使它们是相同的关键名称。 有没有办法在Spring控制器中设置会话cookie,当用户关闭浏览器时会自动销毁?

我还试图通过使用方法来实现@shazin的建议(因为cookie在控制器类中重新创建了很多次),但问题只是部分解决了。具体来说,我采取了以下步骤:

1。)我开始打开几个浏览器窗口,其中只有一个包含正在测试的应用程序 2.)我改变了所有代码,如下所示,
3.)然后我用control-C杀死了应用程序,并且还杀死了在端口上运行的进程 4.)然后我mvn clean package
5.)然后我使用java -jar jarname再次启动应用程序,并将其加载到新的InPrivate浏览器窗口中。
6.)我使用注销方法删除任何可能从以前的版本中徘徊的cookie,
7.)然后我使用GUI来触发新的cookie定义,这些定义按预期工作 8.)然后我通过关闭包含正在测试的应用程序的浏览器窗口进行测试,然后重新打开一个新的浏览器窗口并再次导航到该站点,但cookie值仍然存在,所以这种方法没有解决了这个问题。
9.)最后,我关闭了两个打开的浏览器窗口(每个浏览器窗口都有一些自己打开的选项卡。关闭所有浏览器窗口后,我打开了一个新的浏览器窗口,发现cookie已被删除。因此,只有关闭所有打开的浏览器窗口而不仅仅是包含应用程序的浏览器窗口时,以下方法才有效。

以下是我为实施@ shazin的建议所写的方法:

public Cookie getTempCookie(String key, String val){
    Cookie tempCookie = new Cookie(key, val);
    tempCookie.setMaxAge(-1);
    return tempCookie;
}

以下是我如何从控制器内的各种url模式处理程序调用该方法:

response.addCookie(getTempCookie("AUTH1", "yes"));

当只有包含应用程序的窗口关闭时,我还能做些什么来删除cookie?如果用户关闭浏览器窗口,目前的形式仍存在安全风险没有意识到仍然打开另一个浏览器窗口。

1 个答案:

答案 0 :(得分:4)

您可以做的是将Cookie的Max Age设置为-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.