具有每个请求问题(Hibernate 和 Shiro)的 WebSocket(Atmosphere) - Vaadin

Posted

技术标签:

【中文标题】具有每个请求问题(Hibernate 和 Shiro)的 WebSocket(Atmosphere) - Vaadin【英文标题】:WebSocket (Atmosphere) with Per Request problems (Hibernate and Shiro) - Vaadin 【发布时间】:2013-09-06 21:08:48 【问题描述】:

版本 7 中的框架 Vaadin 使用 Atmosphere 来启用推送逻辑,并且在系统可用时显然还可以“全面”通信, 即通常是来自浏览器的请求。

当 Atmosphere 不使用 WebSockets 时(例如,当 Jetty 未配置 websocket 支持时)这一切都很好,因此必须依赖长轮询或类似的 HTTP“假”推送方法,看起来很长Servlet 调用。

但是,当实际使用 WebSocket 时,ShiroHibernate 都会大声抱怨。

问题在于 Servlet 过滤器不会“启动”WebSockets。 Hibernate 使用 spring 的 OpenSessionInViewFilter 创建每个请求的连接,它还通过在退出时提交/关闭它来充当事务边界。 Shiro 使用 AbstractShiroFilter 的扩展创建 WebSubject 对象 - 它甚至将 ServletRequest 和 ServletResponse 对象粘贴到主题中 - 并在退出时清除“ThreadContext”(它只是一个 ThreadLocal)。

这里有人有什么好主意吗?我希望 Atmosphere 有类似的“try-finally”——比如“filterChain.continue”逻辑,这样就可以重新创建上面描述的这个进入/退出逻辑。但是,到目前为止,正如我所看到的,Atmosphere 没有这种过滤可用。

我很想听听建议。

【问题讨论】:

【参考方案1】:

也许您可以尝试用Atmosfere's interceptors 替换servlet API 过滤器?我想它们对你的情况很有用。

【讨论】:

我其实已经看过这些了,但得出的结论是它们不能用。但是,鉴于您的建议,我又读了一遍,也许它们实际上是适用的?【参考方案2】:

可能已经解决了这个问题,但我想我会插话的。使用 Vaadin、Spring、Hibernate 堆栈遇到了同样的问题。

将此添加到您的 UI 以关闭 WebSockets,它将通过其他过滤器。 @Push(value=PushMode.MANUAL, transport = Transport.STREAMING)

现在我遇到了会话被清除的问题。

【讨论】:

这不是解决方案,而是解决方法。 JASS Push request not preserv JAAS subject on Websocket 的类似问题。

以上是关于具有每个请求问题(Hibernate 和 Shiro)的 WebSocket(Atmosphere) - Vaadin的主要内容,如果未能解决你的问题,请参考以下文章

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

使用 spring 和 hibernate 时,如何处理会话/事务?

hibernate一级和二级缓存介绍

架构:Spring hibernate 应用程序在一台服务器上具有 Web 界面,在不同服务器上具有持久层

Spring Data和Hibernate中不受控制的删除

视图中的休眠打开会话:每个请求的事务?