3

版本 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 没有这种过滤器可用。

我很想听听建议。

4

2 回答 2

2

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

于 2013-09-03T15:37:07.227 回答
1

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

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

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

于 2013-10-11T21:13:26.543 回答