Spring Boot应用程序具有REST服务,可在Spring Controller中设置cookie值,然后使用HttpServletResponse将cookie发送到响应中的客户端,如下所示:
response.addCookie(new Cookie("AUTH1", "no"));
但是当我关闭firefox,然后重新打开firefox并再次调用应用程序的url时,cookie值完全相同.如何在浏览器关闭时确保销毁cookie值,以便在重新打开浏览器时cookie不存在?可以在Spring Boot应用程序中配置吗?或者我是否需要在前端应用程序中配置它?
正在进行的努力:
将后端REST控制器中的所有response.setCookie()行更改为相同键值对的session.setAttribute()行不会产生AngularJS客户端应用程序可以使用$cookies.get(‘keyname’)读取的任何内容,即使他们是相同的关键名称.有没有办法在Spring控制器中设置会话cookie,当用户关闭浏览器时会自动销毁?
我还试图通过使用方法来实现@shazin的建议(因为cookie在控制器类中重新创建了很多次),但问题只是部分解决了.具体来说,我采取了以下步骤:
1.)我开始打开几个浏览器窗口,其中只有一个包含正在测试的应用程序.
2.)我改变了所有代码,如下所示,
3.)然后我用control-C杀死了应用程序,并且还杀死了在端口上运行的进程.
4.)然后我mvn清洁包
5.)然后我再次使用java -jar jarname启动应用程序,并将其加载到新的InPrivate浏览器窗口中.
6.)我使用logout方法删除任何可能从以前的版本中徘徊的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?在目前的形式中,如果用户关闭其浏览器窗口而没有意识到仍然打开另一个浏览器窗口,则仍然存在安全风险.
解决方法:
你可以做的是将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.
标签:java,spring,servlets,spring-boot-2
来源: https://codeday.me/bug/20190523/1156484.html