如何在Java中清除httpsession,如果用户关闭了浏览器

5

我想在消费者关闭浏览器窗口时清除HttpSession。我不知道该如何做,请有经验的人帮助我。

谢谢 & 问候 Chakri


你的会话存储在哪里?在cookie中吗? - Sandeeproop
我很久以前就尝试解决这个问题了,亲爱的兄弟 :) 看看它是否有帮助。https://dev59.com/A3HYa4cB1Zd3GeqPMYQW#16272150 - Suresh Atta
@sᴜʀᴇsʜᴀᴛᴛᴀ,我知道session.invalidate()可以清除会话数据,但我不知道如何检测用户是否关闭了浏览器? - chakri
5个回答

2
如果您能够(可靠地)让浏览器通知服务器用户已关闭窗口,那么服务器可以像ejay_francisco提供的原始答案一样调用session.invalidate()
困难在于如何可靠地发出通知。 有各种方法来检测窗口关闭;例如,如下所述的这些问题(以及类似的问题): 然后,您可以编写(JavaScript)关闭事件处理程序以向服务器发送特定请求。
但是,我认为任何方案都无法处理用户的浏览器崩溃、用户的计算机关闭等情况。因此,如果您需要100%清除会话,则可能没有办法。我认为这是不可能的。

1

可以用稍微不同的方式进行归档。

  1. 使用称为“window.onbeforeunload”的JavaScript事件

    例如 window.onbeforeunload=mylogic_function(); function mylogic_function() { window.location.href = "指向使会话失效的servlet路径"; }

  2. 有一个专门的servlet,其工作仅是注销会话

试试这个..希望能起作用


0
简短回答:你无法做到。幸运的是,会话在一段时间后会自动过期;请查看您的servlet引擎文档以了解如何设置超时时间。
我觉得应该有一种方法可以通过JavaScript实现它;不幸的是,JavaScript似乎没有onWindowClose处理程序。

0

编辑:

尝试阅读此页面上的答案。

"HTTP不是一种连续对话协议,客户端连接到服务器并异步交换信息直到客户端断开连接。相反,每个HTTP客户端请求就像登录一样,执行一个操作,然后退出。这个请求/响应循环重复,直到客户端停止发送请求。在任何时候,服务器都不允许向客户端发送响应,除非它是针对特定实际请求的响应,并且每个请求只允许一个响应。因此,您不能让服务器向客户端发布“超时”页面。最接近的方法是在客户端发出请求时(如果有的话)用“您已超时”的响应页面进行响应。人们想做的另一件常见的事情是通知服务器客户端关闭了浏览器、窗口或选项卡。对于处理这种情况,万维网没有定义协议。如果用户关闭了服务器窗口/选项卡,则客户端不会通知服务器。由于没有持续的会话要中断(请记住,连接只持续足够长的时间,以便服务器接受请求并返回响应),因此服务器将无法知道客户端离开的方式。"

总结:

你做不到

可能的解决方法:

你只需要依赖于会话超时。超时可能随时发生,而且你甚至不知道用户在它发生时是否正在查看你的页面。很可能他们此时正在观看小猫咪的视频。


我认为OP正在询问如何在服务器端接收用户代理(客户端)关闭事件的通知。 - A4L
这没问题,但在SO中,将链接作为答案是非常不受欢迎的。那个链接可能会失效。你需要在这里提供一个实际的答案,并仅将链接用作进一步阅读的参考。 - Gimby
@Gimby,感谢您帮助我改进我的答案。吸取了教训。 - Yaje

-1
如果您关闭浏览器,会清除会话,但是如果您想要强制清除会话,请使用 session.invalidate();。或者,如果您想要移除特定的会话,请使用 session.removeAttribute("<sessionName>");

为什么这个答案被踩了?我使用类似的方法。如果一个属性为空,那么当有人登录时,我将属性设置为用户名。如果他们再次尝试登录并且名称不为空,则不允许他们再次登录(原因太长而无法解释),但是如果他们关闭浏览器,则会话结束,并且属性再次为空,以便在他们再次登录时开始新会话。我的初学者理解是,Servlet容器应该自动处理会话,以便让开发人员集中精力于业务逻辑。 - brat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接