2013-06-24 89 views
2

在我的Struts應用程序中,一旦用戶登錄,我需要使當前會話無效並創建一個新會話。我用無效Sturts 2 session invalidation with setting session session to a new session

getHttpServletRequest().getSession().invalidate(); 

了會議,並創建一個新的會話

getHttpServletRequest().getSession(true); 

這裏的問題是,當上述我嘗試訪問getSession()它給人的狀態無效異常; HttpSession無效。

getSession()返回一個地圖,其中我的動作類I實現了SessionAware,其中有setSession(Map session)

編輯:下面是例外

Error creating HttpSession due response is commited to client. You can use the CreateSessionInterceptor or create the HttpSession from your action before the result is rendered to the client: HttpSession is invalid 
java.lang.IllegalStateException: HttpSession is invalid 

所以,我認爲問題是struts getSession()還是引用我已經失效了會議。

如何使Struts getSession()引用我創建的新會話?

+0

您是否檢查過web.xml的會話超時? –

+0

謝謝。它設置爲30 – Harshana

+0

爲什麼當您使servlet會話失效時訪問struts會話? –

回答

8

如果您想在servlet會話失效後訪問struts會話,則應更新或續訂struts會話。例如

SessionMap session = (SessionMap) ActionContext.getContext().getSession(); 

//invalidate 
session.invalidate(); 

//renew servlet session 
session.put("renewServletSession", null); 
session.remove("renewServletSession"); 

//populate the struts session 
session.entrySet(); 

現在struts會話已準備好使用新的servlet會話,並準備重用struts會話。

+0

上面的代碼應該放在我無效從請求權採取的會話嗎?那麼它說會話已經失效了嗎?我做的是,首先我從請求中取出會話並使其無效。然後添加包含無效的代碼(用於struts會話),最後使用請求創建一個新的會話 – Harshana

+3

@Harshana不,你不應該使servlet會話無效,你應該使struts會話無效,這樣做你1)清理struts會話2)使servlet會話無效。你應該替換代碼。而不是'getHttpServletRequest()。getSession()。invalidate();'放置我的代碼,而不是'getHttpServletRequest()。getSession(true)'。 –

+0

謝謝羅馬。奇蹟般有效。上述的全部目的是修復會話固定。由於它將原始請求會話標識更改爲新的請求會話標識,因此您的解決方案也可以成功解決它。我改變了標題並修改了問題,以突出如何使struts 2中的struts會話失效,以便其他人將受益,因爲您的信息無法在谷歌中找到。再次感謝。 – Harshana