2

Spring-Security と Primefaces をビューとして使用しています。セッションタイムアウト後にユーザーをログインページにリダイレクトするにはどうすればよいですか? Tabview とその中にいくつかのタブがあります。そのため、ajax リクエストでセッション タイムアウトを処理する必要があります。解決策はありますか?

Spring-security.xml ファイル

<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:beans="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">



<http auto-config='true' use-expressions="true">
    <intercept-url pattern="/login" access="permitAll"/>
    <intercept-url pattern="/pages/*" access="hasRole('admin')" />
    <intercept-url pattern="/j_spring_security_check" access="permitAll"/>        
    <logout logout-success-url="/login.xhtml" />
    <form-login login-page="/login.xhtml"
                login-processing-url="/j_spring_security_check"                                                       
                default-target-url="/pages/index.xhtml"
                always-use-default-target="true"                                                        
                authentication-failure-url="/login.xhtml"/>
</http>


<!--Authentication Manager Details -->    
<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="customUserDetailsService">
        <!--            <password-encoder hash="md5"/>-->
    </authentication-provider>
</authentication-manager>

4

2 に答える 2

4

名前空間構成を脇に置き、「純粋な」Bean 構成を使用する場合は、ajax 要求の場合にExceptionTranslationFilter構成をバイパスするようにカスタマイズできます。AuthenticationEntryPointこの例については、こちらで詳しく説明しています。

の考え方はExceptionTranslationFilter、リクエストを実行する前に AuthenticationException または AccessDeniedException がスローされたことを検出することです。これらの場合、通常、ユーザーがログインしていない場合は authenticationEntryPoint を起動する必要があります。 AccessDeniedException が発生し、ユーザーがログインしている場合、ExceptionTranslationFilterは通常、http ステータス コード 403 (アクセス禁止) を返します。

ただしExceptionTranslationFilter、上記のブログ投稿のようにカスタマイズできる場合は、拒否されたリクエストが ajax かどうかを http ヘッダーを調べることで検出できます。この場合、AuthenticationEntryPointリダイレクトを送信する を呼び出す代わりに、前述のスレッド balusCExceptionTranslationFilterのように実行できますが、jsf ExceptionHandler で実行する代わりに実行できます。

この助けを願っています。

于 2013-06-13T20:16:30.093 に答える
1

春のセキュリティとajax(jsf内)の場合、ログインページのリダイレクトリクエストはすでにajaxリクエストハンドラーに送信されていると思います。ここでの唯一の問題は、jsf(prime-faces)のajax標準リクエストハンドラーが同じ処理をしていないことです。

私はjsfの専門家ではありませんが、正確さのためにオプションで実装できる上記の回答に加えて、次の可能な回避策を考えることができます。

  • この問題をいくつかの jsf ページのみで処理する必要がある場合は、p:ajax タグの onsuccess 属性を指定できます。

    • ハンドラーは、成功応答とリダイレクト応答を決定する責任があります
    • ログインページをhtml/jspにすることができれば<?xml、リダイレクトの場合にresponseTextにタグがないことで簡単に検出できます
  • この問題をアプリケーション全体で処理する必要がある場合は、custom-renderer を使用してデフォルトの onsuccess ハンドラを提供できます

カスタム Ajax ハンドラーは、jsf テンプレートのヘッダー セクションに保持する必要があります (レンダラーを使用するか、"onsuccess" 属性を指定して)

function handleAJAX(data,status,xhr) {
        if (xhr.responseText.indexOf("<?xml") == -1) {
            window.location.href="login.jsp";
    }
}

Renderer の場合: (アプリケーション全体の問題を処理する場合)

参照: http://docs.oracle.com/javaee/6/tutorial/doc/bnaxh.html

顔構成

<render-kit>
<client-behavior-renderer>
        <client-behavior-renderer-type>org.primefaces.component.AjaxBehaviorRenderer</client-behavior-renderer-type>
        <client-behavior-renderer-class>test.component.TestRenderer</client-behavior-renderer-class>
    </client-behavior-renderer>
</render-kit>

プライムフェイスのTestRenderer to extend org.primefaces.component.behavior.ajax.AjaxBehaviorRenderer場合は、次のメソッドをオーバーライドします。

public String getScript(ClientBehaviorContext behaviorContext,
        ClientBehavior behavior) {
AjaxBehavior ajaxBehavior = (AjaxBehavior) behavior;
ajaxBehavior.setOnsuccess("handleAJAX(data,status,xhr)");
return super.getScript(behaviorContext, behavior);
}
于 2013-06-24T06:49:13.723 に答える