2

要件は、JSESSIONID がログインの前後で異なる必要があることです。

フローは login.jsp -> loginwebaction -> loginsuccess.jsp -> filter -> otheraction です

私のコードは

  1. ログインに成功した後 (loginwebaction で)、
  2. すべての属性をセッションからマップにコピーし、
  3. セッションを無効にし、
  4. セッションを再作成するHttpSession session = request.getSession(true);
  5. すべての属性をマップから新しいセッションにコピーし、

ログインに成功すると Jsessionid が変化し、 loginsuccess.jsp が表示されます。しかし、私には問題があります。

この後、他のアクションのリンクをクリックすると、フィルターにヒットします。フィルターでは、ログインしている場合はセッションのユーザー情報を確認する必要があり、ログインしていない場合はエラー ページを表示する必要があります。

HttpSession session = request.getSession();
if(null == session.getAttribute("USER_INFO")){
    //redirect to error page
}

問題は次のとおりです。フィルターでアクセスされたセッションが新しく、再作成方法がわかりません。フィルターのコードは

このセッションの変更を修正するためにさらに進む方法はありますか?

4

1 に答える 1

1

ご覧のとおり、コードの問題は次のとおりです。

HttpSession session = request.getSession();

サーブレット APIから、request.getSession()既存のセッションがない場合に新しいセッションを作成します。次のように変更する必要があります。

HttpSession session = request.getSession(false);

これにより、既存のセッション オブジェクト (有効な場合) が返されるか、セッションがない場合は null が返されます。

さらに追加すると、次のコード行は事実上同一です。

HttpSession session = request.getSession();
//Overloaded getSession with 'true' boolean argument
HttpSession session = request.getSession(true);

お役に立てれば。

これで問題が解決しない場合は、別の問題である可能性があります。ユースケースのスケルトン コードを追加してください。試してみることができます。

于 2013-06-18T18:26:01.517 に答える