3

トークンを受け取り、それらを解析し、パラメーターが適用される場合はユーザーにログインする登録ページがあります。

トークンをチェックしてからデータベースからトークンを削除するまでの間に、別のユーザーが同じトークンを使用してログインできます。コードの特定の範囲の行が干渉なしで実行されることを確認する方法はありますか?それで、競合状態の問題は発生しませんか?

ありがとう

アップデート

私は2台のサーバーを持っています。

  1. Apache Tomcat 6
  2. red5 v0.9(無料のJavaベースのフラッシュメディアストリーミングおよび通信サーバー)

Facebook用のゲームアプリケーションを書いています。

ゲーム自体はadobeflashbuilder2で書かれています。

ゲーム自体はred5サーバーを使用して提供されます。問題は、red5がリクエストヘッダーとレスポンスヘッダーを受信しないため、Facebookから情報を取得するために使用するセッション情報を取得できないことです。

ユーザーがTomcatサーバーに接続する問題を解決するために、そのページはFacebook関連情報のセッションをチェックし、tinyFBClientを使用してFacebookに接続し、情報をmysql db(ユーザーの詳細)に保存して、これを確認します。同じユーザーは、red5に接続しようとしているユーザーです。

トークンが作成されたら。Tomcatページには、関連するSWFファイル(ゲームファイル)を表示するために、オブジェクトのHTML要素が表示されます。TomcatページはトークンをそのSWFファイルに渡します。SWFファイルがロードされると、そのトークンを取得し、それを使用してred5に接続し、ユーザー情報を検索します。

説明が私のニーズを理解するのに役立つことを願っています。たくさんのご支援ありがとうございます!

4

5 に答える 5

3

一度に 1 つのスレッドのみが実行できるように、コードのブロックを同期できます。ただし、アプリケーションの速度が低下するため、これはあまり良い解決策とは思えません。複数のユーザーが同時にログインしたいと考えています。

トークンはどのように作成されますか? ユーザーのログインに応じてサーバー側でそれらを生成する場合、あるユーザーが別のユーザーのトークンを使用できないようにする必要があります。

于 2010-02-08T14:28:53.647 に答える
2

ログイン用のトークンを作成している理由がわかりません。あなたの質問は、このトークンがデータベースにあり、メモリにはないことを示唆しているようです。もしそうなら、同期とミューテックスは実際には役に立ちません。必要なのは、「更新の選択」でデータベースレコードをロックすることです。

おそらくこれは多くの無関係な複雑さになりますが、なぜログインを行うためのトークンを作成するのですか?ログインするときはいつでも、画面または受信フォームからユーザーIDとパスワードを収集し、データベースと照合して組み合わせが有効かどうかを確認し、有効な場合はユーザーを入力します。トークンは何のために必要ですか。

于 2010-02-08T14:40:53.630 に答える
2

同期されたメソッド/ブロックが必要なようです:

例はこちらを参照してください(同期方法)

http://java.sun.com/docs/books/tutorial/essential/concurrency/syncmeth.html

逆に焼きすぎないように注意!同期が多すぎると、ボトルネックが発生する可能性があります。

于 2010-02-08T14:27:48.427 に答える
2

Lockオブジェクトを使用できます。

Lock オブジェクトを使用すると、より原始的な同期ブロックやメソッドよりも利点があります。

于 2010-02-08T14:28:21.657 に答える
1

あなたは「データベースからトークンを削除する」と言います。データベースはSQLデータベースですか?その場合は、トランザクションを使用して競合状態を回避できます。次のようになります。

  1. 一意のセッションIDを作成します。例:UUID sessionID = UUID.randomUUID();
  2. トランザクションを開始します
  3. リクエスト内のトークンと一致するトークンをDBから削除します。例:
    DELETE FROM Tokens WHERE TokenID = <requested-token>
  4. 影響を受ける行数を取得する
  5. 影響を受ける行数が正確に1の場合、トークンは有効でした。セッションを作成します。例:
    INSERT INTO Session VALUES(sessionUUID、userID、loginTime、...)
  6. トランザクションをコミットする

ログインが成功した場合(つまり、影響を受ける行数が正確に1だった場合)、セッションIDを含むCookieをクライアントに送信します。

于 2010-02-08T15:14:04.140 に答える