2012-08-08 129 views
1

我們在Flex應用程序中使用Flex 4,BlazeDS和WebLogic 10.3.5重新登錄時遇到問題。在Flex中重新登錄導致Channel.Connect.Failed錯誤NetConnection.Call.Failed:HTTP:Status 500:url

使用情況下造成的問題是這樣的:

  1. 開始在瀏覽器應用程序。
  2. 使用j_security_check操作重定向到登錄表單頁面。
  3. 登錄並使用該應用程序。
  4. 在瀏覽器中點擊「返回」按鈕。
  5. 再次登錄表單頁面。
  6. 重新登錄。
  7. 在BlazeDS中發現異常並捕獲Flex/ActionScript中的錯誤。

陷入登錄WLS異常:

[BlazeDS]Unexpected error encountered in Message Broker servlet 
flex.messaging.LocalizedException: The FlexSession is invalid. 
     at flex.messaging.FlexSession.checkValid(FlexSession.java:943) 
     at flex.messaging.FlexSession.getUserPrincipal(FlexSession.java:254) 
     at flex.messaging.HttpFlexSession.getUserPrincipal(HttpFlexSession.java:286) 
     at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:296) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
     at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300) 
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183) 
     at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717) 
     at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681) 
     at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
     at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
     at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277) 
     at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183) 
     at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454) 
     at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209) 
     at weblogic.work.ExecuteThread.run(ExecuteThread.java:178) 

陷入的Flex/ActionScript中的故障:

faultCode: Client.Error.MessageSend 
faultString: Send failed 
faultDetail: Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 500: url: 'http://server:port/web-project/messagebroker/amf' 

似乎是BlazeDS的獲得了第二次會議,而首先是仍然有效並且活躍。

有誰知道,這正是導致這個問題,以及如何優雅地解決它們?我有幾個小技巧,但不知道他們是否有足夠的合適的:

  • 漁獲的Flex/ActionScript中的故障,重定向到一個退出頁面無效會話,然後重定向到登錄頁面,並創建一個新的會話。
  • 通過JavaScript禁用瀏覽器中的「返回」按鈕。

我會很感激任何建議,解釋和建議。謝謝。

回答

1

問題是會話固定。

會發生什麼:

  • 您登錄
  • 你得到一個會話
  • 你得到FlexSession(設置爲會話屬性)
  • 您單擊後退按鈕
  • 您登錄(傳入老jsessionid)

Spring's SessionFixationProt ectionStrategy:

  • 檢測爲JSESSIONID會話有效
  • 提取舊會話的屬性
  • 無效會話(破壞它)
  • 創建新的會話
  • 轉移舊會話的屬性,以新的會話

當舊會話被破壞時,FlexSession變爲'無效'。

FlexSessions再次,就產生一個會話時, 並自該戰略通過那被無效 相同的參考(厚厚的俄羅斯口音):「我們有問題」

這很容易通過設置策略來解決bMigrateAttributes爲false:

<security:session-management session-authentication-strategy-ref="sas" /> 
    <bean id="sas class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy" p:migrateSessionAttributes="false"/> 

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html

希望這有助於

+0

謝謝你的提示。我現在不在這個項目上工作,但稍後當我回來時讓我們知道結果。 – Sharg 2013-03-13 15:29:05