1

コンテナマネージドセキュリティを使用しているGlassFish3.0.1にデプロイされたWebアプリケーションがあります。これは、JDBCRealmに対してj_security_checkを使用する単純な標準形式ベースの実装です。アプリケーションのセキュリティ保護に関係することはすべて問題ありません(そして、過去に自分のセキュリティシステムを導入したことがあるとは信じられません)。

しかし、私が理解できないのは、ユーザーが間違ったパスワードを入力した場合の対処方法です。「loginFailed.xhtml」ページは正しく表示されますが、ユーザーをログインページに(リンク経由または自動的に)戻して再試行したいと思います。

これを試したところ、login.xhtmlページに戻るリンクは正常に機能しますが、セキュリティシステムは、ユーザーが認証された後、ユーザーを送信しようとしている場所を忘れているようです。ユーザーが正しく認証すると、システムが存在しないページ(ログインページのURLの一部のマングルバージョン)を読み込もうとするため、例外が発生します。

ユーザーをホームページに戻して、そこから再試行させることはできると思いますが、それほど多くの問題を抱えたアプリケーションは長い間見たことがありません。すべてのアイデアと助けを感謝して受け取った...

4

2 に答える 2

0

プレーンなhtmlページでj_security_checkを使用していると思いますよね?HttpServletRequest#loginメソッドを使用して、プログラムによるログインを実際に行うことができます。

これが例です。

public String login() {

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

    try {
        request.login(this.userName, this.password);
        return "index?faces-redirect=true";
    } catch (Exception e) {
        return "error?faces-redirect=true";
    }

そのため、ログイン後、どこにでも送信できます。これは、ユーザー名とパスワードのメンバー変数を持つ標準のJSFバッキングBeanです。

h:commandButtonは、このログインメソッドをjsfアクションとして使用します。

于 2011-04-03T19:45:32.590 に答える
0

実際、別の解決策は、Java でログインを管理したくない場合は、JavaScript を使用することです。

login.html (単純な html フォーム)

<form name="loginForm" method="POST" action="j_security_check">
    <input id="username" type="text" />
    <input id="password" type="password" />
    <input type="submit"value="Login" />
</form>

次に、error.html については、本文のオンロードに JavaScript を追加するだけです。

function redirect() {
window.location("http://yournewurl")
}
于 2011-08-16T01:15:50.150 に答える