1

GAE サーバーが常に 1 つのクライアントとのみ通信するアプリケーションを作成する必要があります (つまり、1 つのメッセージを常に 1 つのクライアントにのみ送信する必要があります)。

私は次のことをします -

パイソン:

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;

それはうまく機能しますが、そのようなシナリオではtokenclient_idがクライアントに渡されます。大丈夫ですか?

4

1 に答える 1

0

これを行わない技術的な理由はありません。セキュリティについて心配している場合、トークンの方がはるかに価値があります。トラフィックをリッスンできる攻撃者がトークンを取得して、別のコンテキストでチャネルメッセージをリッスンする可能性があります。clientidは彼らにそれをさせませんでした。

しかし、私には質問があります。チャネルを介してメッセージを送信するのではなく、POST応答でメッセージを返さないのはなぜですか。または、サンプルコードは例のために単純化されていますか?

于 2012-02-23T20:39:08.907 に答える