3

現在、Java サーブレットのみを使用して、楽しみのために小さな webapp に取り組んでいます。test1 と test2 の 2 つのページがあります。現時点では、次のように test1 で新しいセッションを作成しています。

    HttpSession session = request.getSession(true);
    if (session.isNew() == false) {
        session.invalidate();
        session = request.getSession (true);
    }

test2 では、次のようにセッションを取得しています。

    HttpSession session = request.getSession(false);
    if (session == null) {
        throw new ServletException ("No session.");
    }

したがって、問題は、最初に test2 に移動すると、ブラウザーがセッションを作成するため、常に有効なセッションを取得していることです。最初に test1 に行かなければならないように、test1 から test2 への流れを制限したいと思います。私の計画は、最終的にセッションを作成するログイン ページを作成することですが、ここで見られる問題は依然として存在します。

これをどのように処理すればよいですか?サードパーティのライブラリを含めないでください。私はこれを学習演習としてやっています。

ありがとう!

4

4 に答える 4

9

これは意味がありません。を忘れてくださいrequest.getSession(boolean)request.getSession()無効/有効性について心配する必要はありません。

セッション属性を介してデータを渡したい場合は、次のようにしtest1ます。

request.getSession().setAttribute("test", "foo");

および in (もちろん、これは の後の同じセッションtest2で要求されます): test1

String test = (String) request.getSession().getAttribute("test"); // Returns "foo".

セッションを使用して login-in を確認するにUserは、ログイン コードで次のようにします。

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error?
}

次に、制限区域を表す にFilterマッピングされたで、が存在するかどうかを確認します。url-patternUser

if (((HttpServletRequest) request).getSession().getAttribute("user") != null) {
    chain.doFilter(request, response); // Just continue.
} else {
    ((HttpServletResponse) response).sendRedirect("login"); // Not logged-in, redirect to login page.
}

ログアウトするときUserは、セッションから削除するだけです。

request.getSession().removeAttribute("user");

// Or, more drastically:
request.getSession().invalidate();

または、およびのいくつかの簡単なエントリを使用して、宣言型コンテナ管理セキュリティを探すこともできます。これにより、ログイン/フィルター ロジックを自分で処理する必要がなくなります。web.xmlserver.xml

以下も参照してください。

于 2009-12-02T21:05:35.400 に答える
3

セッションは、最初は空っぽのバスケットです。ユーザーが認証されているかどうかの概念は、ユーザーがセッションを持っているかどうかとは別のものです。

Java EE とサーブレットの仕様により、ログイン ページへのリダイレクトなど、すべてのログイン処理が処理されます。Java EE の組み込み機能について調べてください。多分ここから始めてください。

于 2009-12-02T21:08:29.450 に答える
3

test1 が test2 の前に来るようにフローを制限したい場合は、test1 がアクセスしたことを示す属性値をセッションに入れ、test2 でその属性値をテストします。値がない場合は、test2 を test1 にリダイレクトします。

test1 で、次のようにします。

HttpSession session = request.getSession();
session.setAttribute("test1",true);

次に、test2 で、これを行うことができます。

HttpSession session = request.getSession();
if (session.getAttribute("test1") == null){
    response.sendRedirect("test1");
    return;
}
于 2009-12-02T21:05:29.877 に答える