6

TomcatにWebベースのサービスを実装し、Tomcatコンテナベースの認証を使用しています。私が達成しようとしているのは、ユーザーがどのようにそこにたどり着いたかによって、ログインページの表示を変えることです。具体的には:

  • ユーザーが「ログイン」ボタンをクリックした場合、ログインページでユーザー名とパスワードを要求するだけです。ユーザーを「ログイン」ページに移動するだけのログインボタンを実装し、コンテナーログインがトリガーされるように安全なページを作成しました。

  • 認証されていないユーザーが認証が必要なページにアクセスした場合、ログインページにも「これを行うにはログインする必要があります」などと表示してほしい。

したがって、問題は、ログインフォームのコントローラーまたはJSPに、ブラウザーがここにリダイレクトされたときにブラウザーが何を要求していたかを認識させることです。リクエストオブジェクトのヘッダーやその他の属性を確認しましたが、役立つものは何も見つかりませんでした。

誰かが解決策を提案できますか?または、問題を回避する「ログイン」ボタンを実装する別の方法でしょうか。

4

4 に答える 4

7

これを使用して、元のリクエストのターゲットを決定できます。

<%
String value0 = (String)request.
                getAttribute("javax.servlet.forward.request_uri");
if(value0.contains("login_success.jsp")) {
    out.print("USER, LOG IN!");
} else {
    out.print("USER, you have to LOG IN to go there!");
}
%>

その他のオプションは次のとおりです。

にリダイレクトするログイン ボタンを実装し、URL に をlogin success page追加すると、その属性が で表示され、それに反応することができます。?MyKey=valuelogin page

見つけたすべてのものをプロットし、読みやすくしてから、ここに投稿するコードに取り組みます。ユーザーが次に取得する値は、あなたの のどこかにあると確信しています。どこにあるか見つけるだけです。request

于 2012-04-13T07:33:51.910 に答える
4

いくつかのオプションがあります。1 はヘッダーの「Referer」です。このフィールドには、ブラウザが最後にアクセスした URL が含まれます。ログイン ページで確認できるように、私のページがここにリンクしている最後のページか、または別の場所でした。 .

これは機能しますが、完全ではありません。一部の人々/企業はリファラーなどを除外し、一部のブラウザーではユーザーがそれをオフにできる場合があるため、最後に表示されたページへの参照を取得できません。

最善の策は、ユーザーがログインするときに Cookie の値を割り当てることです。ユーザーがログインを必要とするページを要求した場合、コードは単に存在する Cookie の値をチェックします。そこにある場合、ユーザーはすでにログインしており、ページを表示できます...そうでない場合は、このページを行うためにログインする必要があります.

于 2012-04-17T14:33:06.917 に答える
2

移植性については@Angeloの回答が好きですが、アプリをTomcatに結び付ける場合は、セッションに保存されているトリガー要求からターゲットの宛先(ユーザーがログインした後に移動したい場所)を取得できます。私はこれを試していませんが、うまくいくと思います:

import org.apache.catalina.authenticator.Constants
import org.apache.catalina.authenticator.SavedRequest
import org.apache.catalina.session.StandardSession

...

StandardSession standardSession = 
    (StandardSession) httpServletRequest.getSession();

// Retrieve the SavedRequest object from our session
SavedRequest saved = (SavedRequest)
        standardSession.getNote(Constants.FORM_REQUEST_NOTE);
if ((saved == null) || 
    httpServletRequest.getRequestURI().equals(saved.getRequestURI())) {
    // user came directly to login page
} else {
    // "You must login to do this"
}
于 2012-04-18T22:01:02.923 に答える
2

上記の解決策は、私には逆に思えます。認証コントローラーは、何をすべきかを決定するためにリクエストがどこから来たのかを調べるべきではありません...通知する必要があります。リダイレクトするコントローラー/ルールは、何をしたいのかを認識し、それを適切なアクションに送信する必要があります。

ログインは、サーブレットのログイン アクションに直接進むことができます。

サーブレットがどのように設定されているかはわかりませんが、サーブレットは、何らかのアクションで認証が必要な場合に認証を探す必要があります。認証されていない場合は、認証アクションにリダイレクトします。ログイン/認証アクションは若干異なりますが (パラメーターまたはテキストの設定)、同じビューに移動できます。

そうは言っても、認証を最初から行うのは大変な作業であり、通常は他のフレームワークを取り込む方がはるかに簡単です。例: スプリング セキュリティ。

于 2012-04-19T15:17:39.677 に答える