2012-04-17 11 views
2

のweb.xmlを無視します。面白いことに私はこの作業をしていましたが、私はいくつかのばかげた変更を行いましたが、今はアクセスしていますlocalhost:8080私は常にログインしていなくてもsecure.xhtmlを参照します。localhost:8080/secured/secure.xhtmlはうまくリダイレ​​クトします。ウェルカムファイルは、セキュリティ制約に

答えて

7

あなたは<welcome-file>を完全に使用していません。要求されたフォルダ(ルート/、または/public/または/secured/など)にかかわらず、フォルダが要求されたときにいつでも提供する必要があるファイルの唯一のファイル名を表す必要があります。

ウェルカムファイルは、RequestDispatcher#forward()によって実行される内部転送によって処理されます。内部転送はではなく、はセキュリティ制約を引き起こします。代わりにリダイレクトを送信する必要があります。

<welcome-file>をより初期設定に変更します。 index.xhtml

<welcome-file-list> 
    <welcome-file>index.xhtml</welcome-file> 
</welcome-file-list> 

/index.xhtmlのようにwebappのルートに1つ作成します。

  1. /index.xhtmlのURLパターンにFilter地図やdoFilter()メソッド内response.sendRedirect("secured/secure.xhtml")を呼び出す:あなたは/secured/secure.xhtml/index.xhtmlすべての要求をリダイレクトする必要がある場合は、基本的には2つの方法があります。例えば。

    @WebFilter("/index.xhtml") 
    public class IndexFilter implements Filter { 
    
        @Override 
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
         HttpServletResponse response = (HttpServletResponse) res; 
         response.sendRedirect("secured/secure.xhtml")); 
        } 
    
        // ... 
    } 
    
  2. は、順番にexternalContext.redirect("secured/secure.xhtml")ないバッキングBeanメソッドを呼び出し/index.xhtml<f:event type="preRenderView">を入れてください。例えば。

    @ManagedBean 
    @ApplicationScoped 
    public class IndexBean { 
    
        public void redirect() throws IOException { 
         FacesContext.getCurrentInstance().getExternalContext().redirect("secured/secure.xhtml"); 
        } 
    
    } 
    
+0

<f:event type="preRenderView" listener="#{indexBean.redirect}" /> 

ありがとううわー!しかし、ユーザーがログインしているかどうかをチェックするのはどうですか?私は同じフィルターでこれを行う必要がありますか?これを容器から取り除いても大丈夫ですか? –

+2

''はすでにそうしています。あなたはそれを自分で行う必要はありません。唯一のポイントは、転送の代わりにリダイレクトを実行する必要があることです。リダイレクトによって新しい要求が作成され、新しいURLでセキュリティ制約が再度トリガーされます。フォワードの場合、セキュリティ制約は、設定なしで公開されていてアクセス可能な '/'の初期URLに基​​づいてテストされているため、遅すぎます。 – BalusC

+0

フィルターに問題があります。 'security-constraint'フィルタが呼び出されていない場合は継ぎ目があります。もし' constraint'がコメントアウトされていれば動作します。おそらく、それらが/ secure/*ページ上で重複しているからでしょうか?サーバー - グラスフィッシュ3.1。時間があるなら、私を助けてください。 –