我需要创建一个应用程序,其中GAE服务器将始终只与一个客户端通信(即一条消息应始终只发送给一个客户端)。
我执行以下操作 -
的Python:
def get(self):
# generate token, when page is loaded
client_id = uuid.uuid4().hex
token = channel.create_channel(client_id)
template_values = {'token': token,
'client_id': client_id
}
self.response.out.write(template.render('page.html', template_values))
def post(self):
# reply to the client
...
client_id = self.request.get('id')
channel.send_message(client_id, message)
使用Javascript:
sendMessage = function(field) {
$.ajax({
type: "POST",
url: "/",
data: "f=" + field + "&id=" + "{{ client_id }}", // WARNING!
contentType: "application/x-www-form-urlencoded",
success: function(data) {
}
});
};
onOpened = function() {
connected = true;
sendMessage('opened');
};
onMessage = function(msg) {
alert(msg.data);
};
onError = function(err) {
alert(err);
};
onClose = function() {
alert("close");
};
// open new session
channel = new goog.appengine.Channel('{{ token }}'); // WARNING!
socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;
socket.onerror = onError;
socket.onclose = onClose;
效果很好,但是在这种情况下,token
和client_id
都会传递给客户端。可以吗?
答案 0 :(得分:0)
没有技术理由不这样做。如果您担心安全性,则令牌更有价值:可以侦听您的流量的攻击者可以获取令牌并在不同的上下文中收听频道消息。 clientid不会让他们那样做。
但我确实有一个问题:为什么不在POST响应中返回消息,而不是通过频道发送消息?或者示例代码是否仅为示例简化了?