2011-07-15 9 views
2

私はtomcatでjavaサーブレットを使用しています。 私はハッシュテーブルにユーザー名とhttpsessionに属性usrnameを付けて保存します httpsessionが有効かどうかを知る方法があるかどうかを知りたいと思います。答えをjava httpsessionは有効ですか?

try{ 
    String user = httpSession.getAttribute("username") 
    return "is valid"; 
}catch(IllegalStateException e){ 
    return "is not valid"; 
} 

TNKSが、私は、ユーザーがより多くの1つの場所から接続して「ログイン」という文句を言わないしない場合、私はどのように行うことができます。

は、私が試しましたか?私は新しいセッションを作成する場合にのみ私は制御する場合、私は彼が別のセッションに接続していたかどうかを知ることができません。

答えて

1

保存されたセッションが有効かどうかを確認するのではなく、サーブレットのHttpServletRequestを見て、その上でisRequestedSessionIdValid()をチェックする必要があります。サーブレットで作業する場合、リクエストをハッシュテーブルに保存するのではなく、リクエストからいつでも取得できます。

+0

これは実際には有用ではありません。なぜなら、そこでの不正なStatExceptionの可能性に対処する必要があるからです。チェックとセッション取得の間のマイクロ秒でセッションが無効になる可能性があるためです。 – MJB

+0

サーブレットのリクエストを渡す前にtomcatがセッションIDを見ると、まだタイムアウトしていないかどうかをチェックし、セッションを生き残らせる時間をリセットしていないデフォルトのセッション長が何であっても。いいえ? –

+1

しかし、同時にログアウトを要求することができます。マルチスレッド、マルチサーブレット、覚えている? – MJB

9

httpSessionを自分のハッシュに格納する必要はありません。

HttpServletRequestのapiを見てください。 getSession(Boolean x)を見ると(falseを渡すと新しいセッションを作成しません)、セッションが有効かどうかが判断されます。ここでの例では、私が正しくあなたの質問を読んで、あなたがあなた自身のマップで情報を格納している場合、あなたはメモリリークを作成しないように注意する必要があるとクリアされ、サイドノートで

public void doGet(HttpServletRequest req, HttpServletResponse res){ 
    HttpSession session = req.getSession(false); 
    if(session == null){ 
     //valid session doesn't exist 
     //do something like send the user to a login screen 
    } 
    if(session.getAttribute("username") == null){ 
     //no username in session 
     //user probably hasn't logged in properly 
    } 

    //now lets pretend to log the user out for good measure 
    session.invalidate(); 
} 

ですハッシュテーブルからのエントリを自分で取り出します。

1

私はSeanに同意します。私はチェックのこのタイプの良い練習が

がここServlet Filter

を参照してください。フィルターを使用することであることだけでコードショーンを取る追加されます書かれており、代わりに、フィルターに入れています。 web.xmlでフィルタを定義し、リクエストが来るたびにフィルタが実行されます。

この方法で、ユーザーが認証されているかどうかを検証できます。あなたのサーブレットコードを乱さずに。

+0

フィルタがうまく動作します。私は私の例で基本を示したかったのです。 を1つのサーブレットとともに使用する場合、サーブレットでこのチェックを行うのは問題ありませんが、複数のサーブレットの管理を開始すると非常に乱雑になります。その場合、フィルターに移動する方が良いです – Sean

+0

あなたは正しいです、あなたの応答は非常に良かったです。ちょうど私の2セントを追加したい – Cygnusx1