0

概要 : Web アプリケーション (java、jsp、javascript を使用) でログイン システムを開発しました。

必要な機能:

ユーザーが同じブラウザの 2 つの異なるタブから同時にシステムにログインできないようにします。ユーザーがエラーメッセージ「ユーザーはすでにログインしています」を試行した場合。

問題: ステップ 1) 他のタブまたは 2 番目のタブからログインしようとすると、(予想どおり) エラー メッセージが表示され、再度ログイン ページにリダイレクトされます。ステップ 2) 次に、最初のタブからログアウトし、バックエンドで、作成されたすべてのセッション変数を削除します。ステップ3)次に、他の/2番目のタブログインページからログインしようとすると、セッション変数を再度取得し、空またはnullの変数を取得することが予想されます(ログアウトリクエストのバックエンドですでに削除しているため)。

予期される: 2 番目のタブのログインでセッション変数を再度取得するべきではありません。

4

1 に答える 1

0

セッションは、IP およびユーザー エージェント (つまり、ブラウザー) によって行われます。したがって、同じブラウザーで複数のタブを防止することはできません。また、したい必要はありません。これを行う必要がある場合は、設計に重大な欠陥があるためです。2 人のユーザーとして自分自身をテストする方法を探しているだけの場合は、Chrome に 1 人のユーザーとしてログインし、Firefox に別のユーザーとしてログインします。

ログアウトした後もページにアクセスできるという問題は、認証されていないユーザーがログインするのを防ぐための次のようなものがないことです。

String somevar = session.getAttribute("somevar");
if(somevar == null)
{
   response.sendRedirect("loginpage");
   return;
}

同様に、ユーザーがすでにログインしている場合は、ログイン ページで次のようにします。

String somevar = session.getAttribute("somevar");
if(somevar != null)
{
   response.sendRedirect("mainpage");
   return;
}

そうすれば、すでにログインしているユーザーは、最初にログアウトしない限り、ログイン フォームに再度入力することはできません。

また、キャッシュの問題である可能性もあります。ブラウザーが保護されたページをキャッシュすることを許可すると、ユーザーがログアウトした後、そのページに再度アクセスすると、ページがキャッシュされているためにそのページが表示される場合があります。したがって、no-cache ヘッダーを設定します。

response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");
于 2014-11-22T00:04:25.330 に答える