2012-06-05 13 views
6

JSFを使用したJava EEでのWebアプリケーションの開発。すべてのページは、アクション 'j_security_check'で認証フォームで保護され、 'j_username'と 'j_password'が入力されます。しかし、私は、だから私は、すべてのJSコードを持つスクリプトファイルjsf.jsを見ていないログイン後に間違ったリダイレクト(Java EE/JSF)

/faces/javax.faces.resource/jsf.js?ln=javax.faces&stage=Development 

私がアクセスすることを望んでいたページではなく、このURLにリダイレクトしています、に成功したログイン後

私が見たいと思ったページの代わりに。 Webルートやその他のページにアクセスしても、毎回このURLにリダイレクトされます。

私はすでに魔法のようにこの問題を抱えていたので、正しくリダイレ​​クトされたと言わざるを得ない。数週間後に再び壊れましたが、それが私のせいだったら私はしません。私は、リダイレクトやナビゲーションのルールを全く乱していませんでした。

私はPrettyFacesも使用しています。

EDIT:コンテナが認証チェックをトリガし、最後のHTTPリクエストにリダイレクトされますセキュリティを管理

<security-constraint> 
    <display-name>secured</display-name> 
    <web-resource-collection> 
     <web-resource-name>all</web-resource-name> 
     <description/> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
     <role-name>teacher</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>secured for admins</display-name> 
    <web-resource-collection> 
     <web-resource-name>admin pages</web-resource-name> 
     <description/> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>unsecured</display-name> 
    <web-resource-collection> 
     <web-resource-name>css</web-resource-name> 
     <description/> 
     <url-pattern>/css/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>js</web-resource-name> 
     <description/> 
     <url-pattern>/js/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>img</web-resource-name> 
     <description/> 
     <url-pattern>/img/*</url-pattern> 
    </web-resource-collection> 
</security-constraint> 
<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>wetk-security</realm-name> 
    <form-login-config> 
     <form-login-page>/faces/login.xhtml</form-login-page> 
     <form-error-page>/faces/login.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 
+0

'web.xml'ファイルの' 要素には何がありますか? –

+0

質問を編集しました。 – redhead

答えて

8

。あなたのケースでは、それは明らかに自動組み込みのJSF ajax API JavaScriptファイルです。これは、ブラウザがJSファイルをサーバ側から完全にロードしている間に、ブラウザが認証されたページをブラウザのキャッシュから完全にロードした場合、または条件付きGETリクエストによってJavaScriptファイルのキャッシュ有効性をテストした場合に発生します。

あなたは、認証チェックからJSFリソース(<h:outputScript><h:outputStylesheet><h:graphicImage>を除外したいと思います。あなたは、共通のURLパターン/javax.faces.resource/*を除外していることを行うことができます。あなたは明らかにしているとあなたは/facesプレフィックスパターンを追加するだけでよいでしょう*.xhtmlサフィックスパターンの代わりにそれを使用。

あなたはまた、(ログアウト後に戻るボタンを押すことによって)キャッシュからブラウザの読み込み、それを防ぐためにないキャッシュ制限のページへのブラウザに指示する必要があります。次のフィルタの地図あなたの<security-constraint>と同じURLパターンで入力してください。

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint> 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) request; 
     HttpServletResponse httpRes = (HttpServletResponse) response; 

     if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      httpRes.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 
+0

私はあなたのコードを試して、ログインプロセス(最初のリクエストとフォーム送信後)では、フィルタはリクエストされたページを受け取ることはありません。 URLを再度変更すると受信します。だから、もう一度動作しない、私はまだJSスクリプトが表示されます。 – redhead

+0

テストする前にブラウザのキャッシュをクリアしましたか? – BalusC

+0

私はOperaを完全にクリアしましたが、変更はありませんでした。 – redhead

関連する問題