1

Filterユーザーがいくつかのページにアクセスしたい場合に、ユーザーにログインを強制するために a を使用しようとしています。

したがって、Filterセッションがない場合は、それらをエラーページにリダイレクトする必要があります。

しかし、彼らが にアクセスしたときにこれが発生することを望んでいませんindex.html。なぜなら、彼らはインデックス ページにログインできるからです。

/したがって、とを除くすべてのページに一致する URL パターンが必要index.xhtmlです。

どうやってやるの?で正規表現を使用できますweb.xmlか?

編集:

これを読んだ後

私は次のようなものを作ることができると思いました:

if (!req.getRequestURI().matches("((!?index)(.*)\\.xhtml)|((.*)\\.(png|gif|jpg|css|js(\\.xhtml)?))"))

私のdoFilter()方法では、それでもすべてを処理します。

私はそれをオンラインでテストし、フィルタリングする必要のないファイルに一致するため、正規表現が機能すると確信していますが、除外されたファイルに対しても if の内容が実行されます!

編集2:

新しい方法を試しています。

フィルターを*.xhtmlmyweb.xmlにマップしたので、上記の正規表現で css、画像、javascript を除外する必要はありません。

これが新しいコードです( にdoFilter()

if (req.getRequestURI().contains("index")) {
    chain.doFilter(request, response);
} else {
    if (!userManager.isLogged()) {
        request.getRequestDispatcher("error.xhtml").forward(request, response);
    } else {
        chain.doFilter(request, response);
    }
}

chain.doFilter()ただし、すべてのページで (外側の if) を呼び出すため、まだそうではありません。

インデックス ページをフィルター処理から除外するにはどうすればよいですか?

4

1 に答える 1

5

URL パターンはweb.xml正規表現をサポートしていません。や などのワイルドカードのプレフィックス (フォルダー) とサフィックス (拡張子) の一致のみをサポートし /faces/*ます*.xhtml

あなたの具体的な問題に関しては、どうやらインデックスファイルが として定義されており、<welcome-file>それを で開いているよう/です。このように、はではなくrequest.getRequestURI()に等しくなります。をデバッグして、フィルターが実際に何を取得したかを確認します。/contextpath//contextpath/index.xhtmlrequest.getRequestURI()

書き直しをお勧めします:

String path = request.getRequestURI().substring(request.getContextPath().length());

if (userManager.isLogged() || path.equals("/") || path.equals("/index.xhtml") || path.startsWith(ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/WEB-INF/error.xhtml").forward(request, response);
}

このフィルターを にマップします/*。、などのResourceHandler.RESOURCE_IDENTIFIERJSF リソースもスキップされるよう<h:outputStylesheet>にチェックを含めたことに注意してください。そうしないと、ユーザーがログインしていないときに、CSS/JS/画像のないインデックス ページが表示されます。<h:outputScript><h:graphicImage>

FacesServletが の URL パターンにマッピングされていると想定していることに注意してください*.xhtml/index.xhtmlそれ以外の場合は、それに応じてチェックを変更する必要がありますpath

于 2012-05-22T20:56:11.510 に答える