[英]Session is getting overwritten in Java
我面臨一個奇怪的問題:
提交頁面時,我有一個帶有電子郵件字段的頁面,控件轉到了一個servlet,在其中我通過使用來保存會話中的電子郵件值
request.getSession().setAttribute("email_Value", request.getParameter("email_Value"));
現在,基於此電子郵件值,如果找到信息,則查找數據庫並提取該用戶的信息,然后通過以下方式刪除會話屬性:
request.getSession().removeAttribute("email_Value");
如果沒有,則將請求重定向到同一頁面,並顯示錯誤消息和我從會話中提取的預填充電子郵件值
if(null!= request.getSession().getAttribute("email_Value")){
String Email = (String)(request.getSession().getAttribute("email_Value"));
request.getSession().removeAttribute("email_Value");
}
它在我們的開發,UAT環境中運行良好,但是問題僅在具有負載均衡器的PROD上出現。
問題是,當返回同一頁面時,它將電子郵件地址字段更改為一些不同的電子郵件值,而我什至沒有在計算機上輸入該值,即它正在訪問其他會話。
有人可以提供任何指針來解決此問題。 由於這是生產問題,因此不勝感激。
謝謝
看來您需要使用粘性會話。 必須在apache中配置
Http
是一種stateless
協議,意味着服務器在一段時間內不知道識別客戶端。 當客戶端調用服務器(負載均衡,例如server_1和server_2)時,它可能到達server_1
或server_2
,假設請求到達了server_1
,現在您的code
創建一個session
並將email
添加到該會話中。 當同一客戶端再次調用服務器時,這一次它命中server_2
, server_1
會話中的email
不可用於server_2
並且server_2
可能email
來自另一個session
email
,這就是為什么您看到另一個email
地址的原因。 希望它清除。
如果您的應用程序部署在多台服務器上,則可能會在服務器之間傳輸會話。 同樣,在這種情況下,如果要在會話中存儲任何對象,則它們必須實現Serializable
接口。 如果沒有,則在遷移會話時將不會保留數據。
同樣,該會話似乎與另一個會話互換了。 您是否在應用程序級別存儲任何內容? 我也建議您針對您的情況研究HttpSessionActivationListener 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.