2016-07-12 4 views
1

express.js & socket.ioとチャットをしようとしています。 現在、私のチャットのユーザーは、同じブラウザで複数のタブを開くことができ、これらすべてのタブでチャットできます。これは、同じクライアントが同時にいくつかの人とチャットできることを意味します。私はこの動作を防止したい。socket.ioで同じクライアントを検出する方法

は私がするとき毎回チャットに接続するからクライアントを防ぎたい:

1)クライアントが

2)クライアントが別のブラウザを開いて、同じブラウザで別のタブ上で動作し、それらの上で動作します

どうすればいいですか? ありがとう!

答えて

0

特定のブラウザを識別するためにクッキーを使用して、同じブラウザの異なるタブから同じユーザーを検出することができます。最初の接続(socket.ioまたは特急要求のいずれか)で一意のCookie識別子を設定し、その後の接続では、その一意のCookie識別子が既に使用されているかどうかを確認します。特定のアプリケーションに「使用中」が何を意味するのかを定義する必要があります。 socket.io接続の場合は、現在アクティブな接続が既に存在するため、少し簡単です。 Expressリクエストの場合はリクエストが一時的なので少し難しいので、さまざまなタブの違いをどのように伝えるか、新しいページに移動するタブを1つだけ選択する必要があります(アプリ固有の方法です)。

複数のブラウザを検出するには、ユーザー認証が必要で、複数のアカウントを作成したり、同じユーザーが複数のアカウントを作成しないようにするためのシステムが必要です。前の例と同様に、Cookieにアカウント認証証明書を使用して、このユーザーのセッションがすでに使用されているかどうかを確認します。

+0

まず、ご協力いただきありがとうございます。あなたが正しいという最初のケースでは、クッキーやセッションは、同じブラウザで複数のタブで作業する同じユーザーを検出するのに十分です。しかし、2番目のケースでは、私は、ユーザー認証をmomemtに提供したくありません。私は、複数のブラウザで動作する同じクライアントを検出できるチャットを見ました。このチャットは、ユーザー認証なしで動作します。私は同じことをしたい。 – Emil

+0

私は私の問題に単一の解決策を見つけたと思う。私たちが 'socket.handshake.address'を使ってクライアントのIPアドレスを取得した場合、同じマシンからソケットを介して接続を開くたびに、このクライアントを検出することができます。 – Emil

+1

@Emil - プロキシとNATとプライベートネットワーク上のユーザーのため、IPアドレスが一人のユーザーに一意に対応するという保証はありません。私の家のルータのNATのため、ウェブサイトは私の家のすべてのユーザー(すべて自分のコンピュータのもの)を同じIPアドレスと見なします。同じことが企業のユーザーにも当てはまります。したがって、IPアドレスだけを使用すると、同じプライベートネットワーク上の他の人があなたのサービスを使用しているため、誤って最初の接続を拒否します。あなたの説明のために – jfriend00

関連する問題