我正在创建一个Grails应用程序,该应用程序利用Atmosphere插件将数据推送到浏览器。但是我在为单个用户(会话的用户)创建广播频道时遇到了麻烦。我的代码如下:
服务:
static atmosphere = [mapping: '/atmosphere/recommend']
def onRequest = { event ->
def request = event.request
def response = event.response
event.suspend()
def broadcaster = event.broadcaster
request.session.broadcaster = broadcaster
broadcaster.broadcasterConfig.addFilter(new XSSHtmlFilter())
}
def onStateChange = { event ->
if (!event.message) return
event.resource.response.writer.with {
write "<script>parent.callback('${event.message}');</script>"
flush()
}
}
控制器:
def builder = new JSONBuilder()
def jsonResult = builder.build{
artist = artistInstance
location = {
lat = eventInstance.location.lat
lng = eventInstance.location.lng
}
}
session.broadcaster.broadcast(jsonResult)
此解决方案将jsonResult广播给每个用户。我想要实现的是仅为当前用户广播。 有任何想法吗? 如果您需要更多详细信息,请告诉我们。
由于
答案 0 :(得分:0)
我认为你可以使用session来分享onRequest的事件。
request.session[userId]=event
然后在控制器中:
broadcast(jsonResult,session[userId])
答案 1 :(得分:0)
在grails中定义事件时,可以使用browserFilter闭包过滤掉客户端。
答案 2 :(得分:0)
嘿,您可以使用分配给每个大气资源的uuid
。
要根据大气要求检索暂停的uuid,您可以执行以下操作:
String suspendedUUID = (String)req.getAttribute(ApplicationConfig.SUSPENDED_ATMOSPHERE_RESOURCE_UUID);
答案 3 :(得分:0)
你可以通过会议
session.broadcaster.broadcast(jsonResult,AtmosphereResource)。请参阅此API。
- Jeanfrancois(Atmosphere的创作者)