-1

同様の問題があります...同時ログインの問題が発生したときに「/concurrent.htm?concurrencyError=true」にリダイレクトしたい。

構成は次のとおりです。

 <beans:bean id="concurrencyFilter"
  class="org.springframework.security.web.session.ConcurrentSessionFilter" >
  <beans:property name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="expiredUrl" value="/concurrent.htm?concurrencyError=true" />
  <beans:property name="redirectStrategy" ref="customForwardStrategy" />

しかし、問題は、「expiredUrl」で定義された値に関係なく、「login.htm」にリダイレクトされることです。私がデバッグしたところ、根本的な原因は、最初にconcurrencySessionFilterでconcurrent.htmに転送するリクエストが発生したことですが、その後、フィルターチェーンのシーケンスが続き、認証チェーンでセッションがnullになるため、「loginFormUrl」にリダイレクトされていることがわかりました。 login.htm (この特定の要求は、handleException() メソッドの ExceptionTranslationFilter で発生します -> @sendStartAuthentication 以下に示す行で

else if (exception instanceof AccessDeniedException) {
        if   (authenticationTrustResolver.isAnonymous(SecurityContextHolder.getContext().getAuthentication())) {
            if (logger.isDebugEnabled()) {
                logger.debug("Access is denied (user is anonymous); redirecting to authentication entry point",
                        exception);
            }

            sendStartAuthentication(request, response, chain, new InsufficientAuthenticationException(
                    "Full authentication is required to access this resource"));)

そのため、「concurrent.htm」への以前のリクエストは次のリクエスト「login.htm」によってオーバーライドされ、concurrency.jsp ページではなくログイン ページにリダイレクトされます。

構成されているページにリダイレクト/転送できるように、同時実行フィルターで同時実行エラーが発生したら、それ以上のフィルタリングを停止する構成を追加する必要がありますか???

4

1 に答える 1

1

問題の根本的な原因を見つけました。

根本的な原因:

問題は、Spring3.0.5バージョンまたは一部の構成ではありません。そのすべては、私のjsファイルの1つにある小さなコードによるものです。

/* session timeout handling */
Ext.Ajax.on("requestcomplete", function(conn, response, options){
    //We can do nicer things here, like showing a login window and let
    //the user login on the same screen. But now we simply redirects the
    //user to the login page.
 if(response.responseText.indexOf("<html>") > 0){
    window.location = mFino.BASE_URL + "login.htm";
 }
});

ここで行われていることは次のとおりです。私たちのサイトは完全にextjsを使用して構築されているため、ajaxリクエストを送信します。したがって、ajaxリクエストを送信する場合は、「fix.htm」(ユーザーが一度に複数のシステムにログインすると)と言うことができます。のフィルターが呼び出され、ConcurrentSessionFilterが呼び出されると、リダイレクトが「concurrent.jsp」に発生し、フィルタリングが終了します(もちろん、同時実行フィルターでリダイレクトが発生してフィルターが終了した場合でも、一度に複数のリクエストが送信されると、他のリクエストは、最初のリクエストがリダイレクトされるかどうかに関係なく、定義されたフィルターを通過します-その後、AccessDeniedExceptionが例外フィルターでスローされ、login.htmへのリダイレクトが並行して発生します-しかし、1つだけでも問題に直面しているため、これは根本的な原因ではありませんajaxリクエストが送信されます)つまり、最終的に同時実行されます。jspコンテンツは、ajaxリクエストへの応答として送信されます。

コンテンツ(つまり、response.responseText in

   Ext.Ajax.on("requestcomplete", function(conn, response, options)) 

次のようなhtmlページになります...

"<html>
    <head>
        <title>Adminapplication- concurrency issue page</title>......."

条件が満たされているため、ユーザーはコードに従ってログインページにリダイレクトされます。

 if(response.responseText.indexOf("<html>") > 0){
     window.location = mFino.BASE_URL + "login.htm";
 }

この状態を維持する目的は次のとおりです。通常、ajaxリクエストの応答は、次のようなサンプルのJSONまたはXMLタイプになります。

 {success:true, message:'User name is xxx'}

したがって、セッションタイムアウトが原因で、この種以外の応答(たとえば、html応答)を受け取った場合、単にlogin.htmにリダイレクトしているだけです。

これが、「concurrent.htm」へのリダイレクトに影響を与えている根本的な原因です。

これについて私が思いついた解決策は次のとおりです。

concurrenyHandlerのロジックを変更して、同時実行jspにリダイレクトする代わりにjson応答を送信します。これにより、html応答が順番に生成されます...以下のようになります。

前:

@RequestMapping("/concurrent.htm")

public View concurrenyHandler(HttpServletRequest request, HttpServletResponse response){
        return new ModelAndView("concurrent");
    }

後:

@RequestMapping("/concurrent.htm")

public View concurrenyHandler(HttpServletRequest request, HttpServletResponse response){
        HashMap<String,Object> map = new HashMap<String, Object>();
        map.put("success", true);
        map.put("Error", MessageText._("Session Expired"));
        return new JSONView(map); //JSONView is our custom class which implements org.springframework.web.servlet.View and renders json object as string just like ..."out.write(this.jsonObject.toString());"
     }

jsファイルで、「onrequestcomplete」関数を以下のように変更しました。

/* session timeout handling */
Ext.Ajax.on("requestcomplete", function(conn, response, options){
    //We can do nicer things here, like showing a login window and let
    //the user login on the same screen. But now we simply redirects the
    //user to the login page.
    /*if(response.responseText.indexOf("<html>") > 0){
    window.location = mFino.BASE_URL + "login.htm";
    }*/
 if(response.responseText.indexOf("Session Expired") > 0){
    window.location = mFino.BASE_URL + "login.htm?sessionExpired=true";
 }
});

login.jspで、sessionExpired = trueの状態を確認し、次のようなメッセージでアラートを生成します。

if('<%=request.getParameter("sessionExpired")%>'=='true'){
    alert("The session is expired due to timeout or because the same user logged in on another system");
}

スプリング設定を以下のように変更しました。

 .......<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
    <custom-filter ref="authenticationProcessingFilter" before="FORM_LOGIN_FILTER" />        
    <custom-filter ref="customSessionManagementFilter" after="SESSION_MANAGEMENT_FILTER" />


    <session-management session-authentication-strategy-ref="sas" invalid-session-url="/concurrent.htm"/>
</http>

<beans:bean id="authenticationProcessingFilter" class="com.mfino.uicore.security.AuthProcessingFilter">
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="sessionAuthenticationStrategy" ref="sas" />
</beans:bean>

 <beans:bean id="customSessionManagementFilter" class="com.mfino.uicore.security.CustomSessionManagementFilter">
</beans:bean>


<beans:bean id="concurrencyFilter"
    class="org.springframework.security.web.session.ConcurrentSessionFilter" >
    <beans:property name="sessionRegistry" ref="sessionRegistry" />
    <beans:property name="expiredUrl" value="/concurrent.htm" />
</beans:bean>..........

これで、必要に応じて同時実行例外が発生したときに、ログインページにメッセージとともにアラートを表示できるようになりました[以前は、ログインページの状態を確認するために「sessionExpired=true」などのリクエストパラメータを送信できなかったことが心配でした。そして、スプリングハンドラーによって行われるリダイレクトに関係なく、常にlogin.htmにリダイレクトされていたので(そのようなreqstパラメーターなしで)アラートを出します]。

これについて私を導いてくれた@LukeTaylorに感謝します!!!!

于 2012-09-27T13:02:01.973 に答える