問題の根本的な原因を見つけました。
根本的な原因:
問題は、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に感謝します!!!!