2012-03-20 25 views
1

ここでは、 How to Prevent Concurrent User Logins in PHP/MySQL Site? などの良い例をいくつか見てきましたが、私が解決しようとしている問題について説明しています。基本的には、同じPCまたは2台の異なるPCから、特定のユーザーが一度に1つのセッションのみを開くことができます。 DBにLoggedIN/NotLoggedINフラグを照会するのが最も簡単な解決策です。 これを実装する方法は私の問題です。
ページがリクエストされるたびに実行される各ページにセッションの検証が追加されていると、すべてのJSPを変更する必要があります(ロングストーリーは共通ヘッダーファイルがありません) できることはありますかTomcatを再構成して、DBに問い合わせるために各要求に対していくつかの検証チェックを実行しますか?多分バルブや他の手段を使っていますか?私は多くのTomcatの経験がないので、これが私が尋ねる理由です。 ThnxTomcatを使用して同じPCからの同時ユーザーセッションを防止する

答えて

2

すべてのJSPファイルを変更する代わりに、Filterを使用して調べることができます。このフィルタを使用すると、要求をインターセプトして、要求に対して一定のレベルの検証を実行できます。

しかし、アクティブなセッションがあなた次第であることを確認することにします。

public class SessionCheckFilter implements Filter { 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
    throws IOException, ServletException { 

    //Your validation code here. 
    boolean returnValue = YourClass.performSessionValidation(); 
    if(returnValue){ 
     //Do Something 
    }else{ 
    //Do Something else 
    } 

    //standard filter call 
    chain.doFilter(req, res); 
} 

次に、サーブレットをコードにマップします。詳細については、(必要に応じて変更)

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>com.stackoverflow.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
</filter-mapping> 

返信用SO

+0

おかげでここservlet-filter情報ページを参照してください。セッションがいつ作成されたのかを追跡し、マップに追加するためにServletRequestListenerも必要ですか?フィルタは、私のSessionListenerが作成したマップにアクセスできますか?私は、DBアクセスが必要ない解決策を得たいと考えています。だから私はすべての現在のアクティブなセッションIDを格納するためにハッシュマップを使用する行に沿って考えてきましたが、これは可能ですか? – MayoMan

+0

あなたのセッションを追跡するために静的なハッシュマップを使用することが可能です。非常に注意してください。セッションがあまりにも長くアイドル状態になった後、ハッシュマップをクリーンアップするためのメカニズムを実装する必要があります。それ以外の場合は、自分でメモリリークを作成します。 – Sean