Архитектура кометы Lift, которую Novell выбрала для питания своего продукта Pulse после оценки ряда различных технологий.
Реализация кометы Lift использует одно соединение HTTP для опроса изменений произвольного числа компонентов встраница.Каждый компонент имеет номер версии.Длинный опрос включает номер версии и GUID компонента.На стороне сервера прослушиватель подключен ко всем идентификаторам GUID, перечисленным в длинных запросах опроса.Если какой-либо из компонентов имеет более высокий номер версии (или номер версии увеличивается в течение периода длинного опроса), дельты (набор JavaScript, описывающий изменение от каждой версии) отправляется клиенту.Дельты применяются, и номер версии на клиенте устанавливается равным наибольшему номеру версии для набора изменений.
Lift объединяет длинный опрос с управлением сеансом, так что если запрос приходит в тот же URL во время длительного опросаЭто может вызвать истощение соединения, длительный опрос прерывается, чтобы избежать истощения соединения (некоторые браузеры имеют максимум 2 HTTP-соединения на один именованный сервер, другие имеют максимум 6).Lift также поддерживает DNS-серверы с подстановочными символами для длинных запросов на опрос, так что каждая вкладка в браузере может выполнять длительный опрос для другого DNS-сервера с подстановочными символами.Это позволяет избежать проблем с истощением соединения.
Lift динамически обнаруживает контейнер, в котором работает сервлет, и на Jetty 6 и 7, и (скоро) Glassfish, Lift будет использовать реализацию "продолжений" платформы, чтобы избежать использования потока во времядлинный опрос.
JavaScript лифта может располагаться поверх jQuery и YUI (и может также располагаться поверх Prototype / Scriptaculous.) Фактический код опроса включает в себя откат при сбоях соединения и другие «изящные»способы борьбы с временными сбоями соединения.
Я смотрел на Atmosphere, CometD, Akka (все технологии Comet, ориентированные на JVM).Ни один из них (в то время, когда я их оценивал) не поддерживал несколько компонентов на странице или предотвращал истощение соединений.
Novell начала с нуля и выбрала Lift для включения Pulse по некоторым очень веским причинам.
InС точки зрения безопасности, Лифт бьет Spring + Spring Security руки вниз.См. http://www.mail-archive.com/liftweb@googlegroups.com/msg13020.html
По сути, безопасность Lift встроена в ваше приложение.По умолчанию приложения Lift устойчивы к распространенным проблемам (межсайтовый скриптинг, атаки с повторным воспроизведением, подделки межсайтовых запросов).Приложения лифта по умолчанию устойчивы к изменению параметров.Карта сайта Lift определяет правила навигации по сайту и правила контроля доступа.Это означает, что у вас никогда не будет ссылки, по которой кто-то не сможет щелкнуть.Вам не нужно иметь внешний фильтр (например, Spring Security), который нужно настраивать независимо от приложения (упс ... переместил страницу, но забыл убедиться, что XML-файл Spring Security обновлен.)
Ох ... и если вы не хотите использовать язык шаблонов, вот полный компонент чата 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"/>