2011-07-28 4 views
4

私はエンタープライズレベルのJavaバックエンドアプリケーションを使用しています。トークンベースのユーザー認証を構築する必要があります。フロントエンドはPHPを利用し、SOAP経由でJavaバックエンドと通信します。GuavaのHashBiMapをエビクションで使用する方法はありますか?

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

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

どのようにHashBiMapを使用し、非アクティブのために退去をサポートすることができるかについての推奨事項はありますか?このアプローチが理想的でない場合、私は他の戦略にもオープンしています。

アップデート:私は、私はマップ内のユーザーオブジェクトを検索し、ユーザーがマップ内に残っている場合は、その既存のトークンを取得できるようにしたいので、HashBiMapを使用する必要があると思う

。たとえば、ユーザーが30分のウィンドウ内でブラウザを閉じて数分後に再びログインして再度ログインする場合、ユーザーが既にマップに存在するかどうかを確認して、既存のトークンを返すことができるようにする必要があります技術的にはまだ有効です)。

+0

あなたが説明していないことの1つは、なぜ 'UUID'マッピングに逆' User'が必要なのかです。あなたが記述したもののために 'User'マッピングだけで' UUID'が十分であるようです。 – ColinD

+0

@ColinDあなたのコメントありがとう!上記の私の質問へのアップデートをご覧ください。 –

答えて

3

最も単純な答えは、いいえ、自動追い出しでHashBiMapを持つことはできません。 MapMakerが作成するマップは、特殊な同時マップです。 HashBiMapは、基本的には2つのラッパーの周りにあります。HashMapです。

1つのオプションは、立ち退きにMapMaker -createdマップにUUIDUserへのマッピングを格納し、弱い鍵を持つ別のMapMaker -createdマップにUserUUIDへのマッピングを格納するかもしれません。追い出しを伴うマップのエントリが追い出されたときに、UUIDへの参照が他の場所で保持されていないと仮定して、UUIDの弱い参照がクリアされているため、すぐに逆マップのエントリを無効にする必要があります。ユーザーが再びログインするときにそのマッピングが残っていても、マップ内のUUIDを削除して検索し、エントリが見つからない場合は、新しいUUIDを生成して新しいマッピングを作成する必要があります。

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

+0

2番目のマップで、ユーザーが弱い参照になるという意味ではありませんか? –

+0

@ Kublai Khan:2番目のマップの 'User'か' UUID'の弱い参照がおそらく動作します。 – ColinD

+0

@ColinD答えてくれてありがとう、ありがとう! –

2

@ ColinDの答えをエコーするには、HashBiMapは非遅延マップラッパーです。そのため、に反映されたMapMakerマップの変更は自動的には表示されません。

しかし、すべてが失われません。 @ColinDは2つのマップを使って提案しました。これをさらに進めるには、ソースマップをコピーするのではなく、ビューベースのカスタムBiMap実装でこれら2つのマップをラップしないでください(HashBiMapのように)。これにより、必要なカスタム機能を持つBiMapの豊富なAPIが提供されます。

+0

もう一度お寄せいただきありがとうございます。私はそれを試してみましょう。 –

関連する問題