4

エンタープライズ レベルの Java バックエンド アプリケーションを使用しており、トークン ベースのユーザー認証を組み込む必要があります。フロントエンドは PHP を利用し、SOAP を介して Java バックエンドと通信します。

問題を解決するために Guava の HashBiMap を使用することを考えました。UUID トークンをキーとして生成し、User オブジェクトを値として静的 HashBiMap に格納できるので、私にとっては便利です。ユーザーが最初に正常にログインすると、ユーザーは HashBiMap に追加され、ログイン応答で生成された UUID トークンが返されます。同じユーザーに対する後続の SOAP 要求は、トークンのみを使用して行われます。

私が今直面している問題は、これらのトークンが 30 分間非アクティブになった後に削除できるようにする何らかの削除ロジックが必要なことです。私の調査では、HashBiMapは Guava のMapMakerのようにエビクションをネイティブにサポートしていないようです。

HashBiMap をどのように使用し、非アクティブな場合の立ち退きをサポートするかについて、誰かに推奨事項はありますか? このアプローチが理想的でない場合、私は他の戦略を受け入れます。

アップデート:

HashBiMap を使用する必要があると思います。ユーザーがまだマップ内にある場合は、マップ内のユーザー オブジェクトを検索し、既存のトークンを取得できるようにしたいからです。たとえば、ユーザーが 30 分以内にブラウザーを閉じ、数分後に戻って再度ログインした場合、既存のトークンを返すことができるように、ユーザーがマップに既に存在するかどうかを確認する必要があります (技術的にはまだ有効です)。

4

2 に答える 2

3

HashBiMap最も簡単な答えは、いいえ、自動エビクションを使用できないということです。作成されるマップMapMakerは、特殊な並行マップです。は基本的に 2 つの s のHashBiMap単なるラッパーです。HashMap

1 つのオプションは、エビクションを使用して-created マップにUUIDtoマッピングを格納し、弱いキーを持つ別の-created マップにtoマッピングを格納することです。エビクションを伴うマップ内のエントリがエビクトされると、弱参照がクリアされるため、逆マップ内のエントリはすぐに無効になります (への参照が他の場所に保持されていないと仮定します)。ユーザーが再度ログインしようとしたときにそのマッピングがまだ残っていたとしても、エビクションを使用してマップを検索し、そのエントリが見つからない場合は、新しいマッピングを生成して新しいマッピングを作成する必要があることがわかります。UserMapMakerUserUUIDMapMakerUUIDUUIDUUIDUUID

もちろん、これらすべてを実行する際には、潜在的な並行性の問題を考慮する必要があります。

于 2011-07-28T22:17:39.987 に答える
2

@ColinDの答えをエコーするにHashBiMapは、遅延のないマップラッパーです。MapMakerそのため、に反映されたマップからの変更が自動的に表示されるわけではありませんBiMap

ただし、すべてが失われるわけではありません。@ColinD は、2 つのマップを使用することを提案しました。これをさらに一歩進めてBiMap、ソース マップをコピーするのではなく、ビューベースのカスタム実装でこれら 2 つのマップをラップしてみませんか (HashBiMapそうです)。BiMapこれにより、必要なカスタム機能を備えた表現力豊かな API が提供されます。

于 2011-07-28T23:19:44.203 に答える