在评估了许多不同的技术之后,Novell选择了Lift的Comet体系结构来为其Pulse产品提供动力。
Lift的Comet实现使用单个HTTP连接来轮询页面上任意数量组件的更改。每个组件都有一个版本号。长轮询包含版本号和组件GUID。在服务器端,侦听器连接到长轮询请求中列出的所有GUID。如果任何组件的版本号更高(或在长时间轮询期间版本号增加),则将增量(一组Javascript来描述每个版本的更改)发送给客户端。应用增量,并将客户端上的版本号设置为更改集的最高版本号。
Lift将长时间轮询与会话管理集成在一起,因此,如果在长时间轮询期间请求进入相同的URL会导致连接匮乏,则终止长时间轮询以避免连接匮乏(某些浏览器每个命名服务器最多具有2个HTTP连接,其他人最多6个)。Lift还支持针对长期轮询请求的DNS通配符服务器,以便浏览器中的每个选项卡都可以针对不同的DNS通配符服务器进行长期轮询。这避免了连接匮乏的问题。
Lift动态检测Servlet在Jetty 6和7和(很快)Glassfish上以及其上运行的容器,Lift将使用平台的“
continuations”实现来避免在长时间轮询期间使用线程。
Lift的Javascript可以位于jQuery和YUI之上(也可以位于Prototype /
scriptaculous之上。)实际的轮询代码包括对连接失败的退避以及其他处理过渡连接失败的“优美”方式。
我看过Atmosphere,CometD,Akka(所有面向JVM的Comet技术)。没有一个(在我评估它们的时候)每页支持多个组件或避免了连接匮乏。
Novell从零开始,出于某些很好的原因,选择了Lift为Pulse供电。
在安全性方面,Lift击败了Spring + Spring Security。请参阅http://www.mail-
archive.com/liftweb@googlegroups.com/msg13020.html
基本上,Lift的安全性已融入您的应用程序中。默认情况下,Lift应用可以抵抗常见问题(跨站点脚本编写,重播攻击,跨站点请求伪造)。默认情况下,Lift应用可以抵抗参数篡改。Lift的站点地图定义了站点导航和访问控制规则。这意味着您永远不会有别人无法点击的链接。您不需要必须与应用程序独立配置的外部过滤器(例如,Spring
Security)(哇…移动了页面,但是忘记确保Spring Security XML文件已更新。)
哦…而且,如果您不想使用模板语言,那么这里有一个完整的Lift Comet聊天组件:
class Chat extends Cometactor with CometListener { private var msgs: List[String] = Nil def registerWith = ChatServer override def lowPriority = { case m: List[String] => msgs = m; reRender(false) } def render = { <div> <ul> { msgs.reverse.map(m => <li>{m}</li>) } </ul> <lift:form> { SHtml.text("", s => ChatServer ! s) } <input type="submit" value="Chat"/> </lift:form> </div> }}并将其插入页面:
<lift:comet type="Chat"/>



