【发布时间】:2011-10-27 11:31:52
【问题描述】:
我正在尝试在 CometActor 中检索 url 参数以验证数据源是否与目标匹配,例如,用户从房间 A 发送消息,该消息应仅在房间 A 中接收和显示,而不是在房间 B 中或 C。
我试过了:
S.param("message").openOr("")
但是总是空的,这样可以吗?还是有其他方法可以阻止 Comet 消息发送到不应该发送的位置?
提前感谢您的帮助,非常感谢:)
【问题讨论】:
我正在尝试在 CometActor 中检索 url 参数以验证数据源是否与目标匹配,例如,用户从房间 A 发送消息,该消息应仅在房间 A 中接收和显示,而不是在房间 B 中或 C。
我试过了:
S.param("message").openOr("")
但是总是空的,这样可以吗?还是有其他方法可以阻止 Comet 消息发送到不应该发送的位置?
提前感谢您的帮助,非常感谢:)
【问题讨论】:
CometActor 存在于会话之外,因此无法访问(大部分)它。解决方案是使用包含所需会话数据的初始化消息来初始化参与者。有某种帮手,也许在 LiftRules 中,可以做到这一点。我正在用手机回忆这件事,但希望这足以继续。
具体来说,您将要执行以下操作:
for (
session <- S.session
message <- S.param("message")
) {
session.setupComet("myCometActor", Some("unique name, if you want it"), message)
}
在你的Boot.scala.
查看LiftSession 了解更多信息。我认为可能有一种方法可以连接到LiftRules,以便在创建会话时调用相关代码......
更新:如果我们发送包含以下内容的案例类,您的 CometActor 可能会是这样的:
// ...
session.setupComet(
"myCometActor",
Some("unique name, if you want it"),
Message(message)
)
// ...
case class Message(text: String)
class CometMessage extends CometActor {
override def lowPriority = {
case Message(text) => {
// do something here with the text, whether settings a SessionVar or even just a plain var
}
}
}
【讨论】:
lowPriority。
CometActor 存在于 HTTP 请求/响应周期之外。这意味着在 CometActor 中处理消息期间,您看不到 Req,因为在消息处理过程中从来没有 Req 可用。
与此线程上的某些帖子相反,S 上下文 和 SessionVars 一样可用(但 RequestVars 不可用,因为 CometActor 超出了请求的范围)。
(...)
最好的办法是创建一个保存主机和端口的 SessionVar(或几个 SessionVar)。从 sn-p 设置这些 SessionVars(如果尚未设置)。然后从 CometActor 访问 SessionVars。
这是一种可能的选择。但是,我个人的偏好是使用NamedCometActorSnippet 将彗星插入页面并立即向创建的彗星发送消息:
class MyCometSnippet extends NamedCometActorSnippet {
val cometClass = "MyComet"
val name = "MyComet-instance"
for {
liftSession <- S.session
processingMode <- S.param("message")
} yield {
liftSession.sendCometActorMessage(cometClass, Full(name), SetMessageValue(message))
}
}
【讨论】: