如何关闭vaadin会话但在浏览器关闭时保持http会话?

时间:2013-10-17 12:13:28

标签: java session vaadin httpsession

我正在开发一个带有用户身份验证和授权的vaadin 7应用程序,使用带有在应用程序服务器(glassfish)中定义的领域的jaas。

我有这个要求:

  • 用户可以保持登录一段时间,这样他每次都不需要输入密码。
    我是通过设置http会话的会话超时来完成的。

  • vaadin会话可以锁定某些资源,而在锁定时,其他任何会话都无法使用此资源。当vaadin会话关闭时,将释放所有锁定的资源 我将心跳间隔设置为仅15秒。

我无法同时满足这两项要求。 如果我将http会话超时设置为一分钟,关闭浏览器后一分钟就会释放资源,但下次用户未经过身份验证。
如果我将https会话超时设置为某些天,则用户将在此时进行身份验证,但在3次错过心跳后,vaadin会话不会立即关闭。只有当用户下次使用相同的http会话时才会关闭它。

如何实现这两个要求?

以下是我正在使用的技术的更多信息:

  • Glassfish 4
  • web-app 3.1
  • vaadin 7.1.7
  • vaadin-cdi 1.0-SNAPSHOT

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您可能希望看一下st Spring Security,尤其是Remember-Me Authentication - 我个人会使用的替代方法,而不是尝试自己实施安全持久登录。

如果你想走DIY路径:

我认为试图将Vaadin与Http Session分开并不是一个好主意。 Application lifecycle section of the Vaadin book说:

  

当新客户端连接时,它会创建一个新的用户会话,由VaadinSession实例表示。使用存储在浏览器中的cookie跟踪会话。 ... [Vaadin Session]还通过WrappedSession提供对较低级别会话对象HttpSession和PortletSession的访问。

也许您可以更改第一个要求的解决方案("用户可以保持登录一段时间,这样他每次都不需要输入密码。&#34 ; )通过将登录凭据与http会话分开?

您可以将一些带时间戳和唯一ID存储为Cookie(带有过期日期),customize the VaadinServlet带有您自己的SessionInitListenerSessionDestroyListener来检查(并设置)它取决于您在服务器上执行的检查,要么需要登录凭据,要么接受来自客户端的凭据。

答案 1 :(得分:1)

您的问题存在一些含糊之处,但我相信您可以使用自己的close()方法解决它。您可以使用自定义close()方法创建自己的Vaadin Application类,或使用TPTApplication并覆盖其close()方法:

http://vaadin.com/directory#addon/toolkit-productivity-tools:vaadin

确保会话关闭时调用close,并在那里进行清理。会话结束时也会调用此方法。

如果你不能确保这一点(即,如果用户只是关闭窗口并且你没有一些javascript来处理这个),你可以用Vaadin拦截窗口,但它的工作要多得多。当用户尝试关闭窗口时,您将中断该过程,通过回调执行您需要执行的操作,然后关闭该窗口。有关如何从vaadin中断的详细信息如下所示:

https://vaadin.com/forum/#!/thread/44621/44668
https://vaadin.com/forum/#!/thread/83207/83206

回调只是客户端,所以你必须调用服务器(通过javascript获取/ POST),它会将会话ID传递给你已经监听过的servlet。然后,servlet将使用传入的会话ID释放锁。

关键是监听窗口关闭并能够适当地响应它。