1

私のサイトのユーザーに、誰かがコメントした記事にコメントしたことを知らせたいというシナリオがあります。これは、誰かが質問に回答したときに SO が私に通知する方法によく似ています!

サーバー側では、コメントを保持し、同じ記事にコメントしたすべてのユーザーを検索します。次に、ブロードキャストします (私は Atmosphere を使用しています):

PushContext pushContext = PushContextFactory.getDefault().getPushContext();

for(User u : users){       
    // channel name, message
    pushContext.push("/user_" + u.id, "someone commented! blah blah"); 
}

私がブロードキャストしている「チャンネル」は、ユーザーの「自分の」チャンネルです。すべてのユーザーに通知したくないからです。これを実現するために、チャネル名にユーザーの ID を使用します。

これは、関連するユーザーのみが通知されるようにする正しい方法ですか?

あと 2 つのこともやりたいと思います。

  1. まだオンラインであると私が信じているユーザーにのみプッシュしてください。それらがオンラインでない場合、リソースをプッシュするのは無駄です。
  2. メッセージを暗号化します。暗号化しないと、私のユーザー ID を知っていれば、だれでも私のメッセージを聞くことができます。

他に考えなければならないことはありますか?

4

1 に答える 1

1

SOはWebSocketを使用します。たとえば、この投稿にコメントが作成されると、SOページの左上にあるステータスバーに通知が表示されます。

ページが読み込まれると、ブラウザは次のようなプロトコルアップグレード要求を行います。

Request URL:ws://sockets-se.or.stackexchange.com/
Request Method:GET
Status Code:101 Switching Protocols
Request Headersview source
Connection:Upgrade
Cookie:__qca=P0-1697817643-1763440830313; __utma=27376923.959753990.1338240830.1353943751.1384115154.33; __utmc=27693525; __utmz=27699983.1356175156.31.31.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)
Host:sockets-se.or.stackexchange.com
Origin:http://stackoverflow.com
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:6qFl45+6gZ526yMMo79zWQ==
Sec-WebSocket-Version:13
Upgrade:websocket
(Key3):00:00:00:00:00:00:00:00
Response Headersview source
Connection:Upgrade
Sec-WebSocket-Accept:B4h2G+gi78iNZZXg+o6iAztgF1I=
Upgrade:websocket
(Challenge Response):00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

その後、ソケットが開かれ、サーバーは更新をブラウザーに送信できます。たとえば、私のコメントの通知は、ブラウザによって次のように受信されます。

{"action":"1-question-12993099","data":"{\"a\":\"comment-add\",\"id\":12993099,\"commentid\":19334206,\"acctid\":1298157}"}

実際のコメントは含まれていません。これは単にブラウザに赤いアイコンを表示するように指示するために使用されているようです。次にクリックすると、コメントを含むページの取得を要求します。そのフレームには、質問ID(12993099)、コメントID(19334206)、アカウントID(1298157)が含まれています。

上記の内容では、ハッカーが通知を聞くためのWebソケットを作成するのを妨げるものは何も見当たりません。クッキーは私にはGoogleAnalyticsのクッキーであるように見えます。少なくとも2番目と3番目のクッキーはそうです。おそらく最初は、私がそれを公開しただけではなかったら、あなたが知らないであろういくつかのコードです(心配しないでください、私はそれを変更します!)。

Atmosphereの例では、Web Socketsが機能しない場合、デフォルトで長いポーリングが行われ、チャネル名を含むURLが要求されることがわかっています。したがって、クライアントにチャネル名を生成させ、それをクライアントだけが認識し、それをログインしたユーザーに関連付けることができます。ただし、ネットワークをスニッフィングする人は誰でもトラフィックにアクセスできるため、セキュアWebソケット(WSS)とHTTPS(長いポーリングフォールバック用)を使用してネットワークを保護する必要があります。

于 2012-12-22T17:20:12.530 に答える