我正在尝试检索CometActor中的url参数以验证数据源是否与目标匹配,例如,用户从房间A发送消息,该消息应该仅在房间A中接收和显示,而不是B或C.
我试过了:
S.param("message").openOr("")
但它总是空的,可以这样做吗?还是有另一种方法可以阻止彗星消息进入他们不应该去的地方吗?
提前感谢您的帮助,非常感谢:)
答案 0 :(得分:4)
CometActors存在于会话之外,因此无法访问(大部分)它。解决方案是使用包含所需会话数据的初始化消息初始化actor。可能会在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
}
}
}
答案 1 :(得分:0)
CometActors存在于HTTP请求/响应周期之外。这意味着在CometActor中处理消息时,您无法看到Req,因为消息处理过程中从未提供过Req。
与此线程上的一些帖子相反,S上下文 可用,因为SessionVars(但不是RequestVars,因为CometActor不在请求范围内)。
(...)
最好的办法是创建一个容纳主机和端口的SessionVar(或几个SessionVars)。从片段中设置这些SessionVars(如果它们尚未设置)。然后从CometActors访问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))
}
}