Cod*_*Med 5 java spring servlets spring-boot
Spring Boot应用程序具有REST服务,可在Spring Controller中设置cookie值,然后使用以下方法将cookie发送到响应中的客户端HttpServletResponse:
response.addCookie(new Cookie("AUTH1", "no"));
Run Code Online (Sandbox Code Playgroud)
但是当我关闭firefox,然后重新打开firefox并再次调用应用程序的url时,cookie值完全相同. 如何在浏览器关闭时确保销毁cookie值,以便在重新打开浏览器时cookie不存在? 可以在Spring Boot应用程序中配置吗?或者我是否需要在前端应用程序中配置它?
正在进行的努力:
将response.setCookie()后端REST控制器中的所有行更改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.)我使用logout方法删除任何可能从先前版本中徘徊的cookie,
然后我使用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;
}
Run Code Online (Sandbox Code Playgroud)
以下是我如何从控制器内部的各种url模式处理程序调用该方法:
response.addCookie(getTempCookie("AUTH1", "yes"));
Run Code Online (Sandbox Code Playgroud)
当只有包含应用程序的窗口关闭时,我还能做些什么才能删除cookie? 在目前的形式中,如果用户关闭其浏览器窗口而没有意识到仍然打开另一个浏览器窗口,则仍然存在安全风险.
您可以做的是将 Cookie 的 Max Age 设置为 -1,这将不会保留 cookie,并会在浏览器关闭时删除。
Cookie authCookie = new Cookie("AUTH1", "no");
authCookie.setMaxAge(-1);
response.addCookie(authCookie);
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4522 次 |
| 最近记录: |