簡體   English   中英

會話在Java中被覆蓋

[英]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_1server_2 ,假設請求到達了server_1 ,現在您的code創建一個session並將email添加到該會話中。 當同一客戶端再次調用服務器時,這一次它命中server_2server_1會話中的email不可用於server_2並且server_2可能email來自另一個session email ,這就是為什么您看到另一個email地址的原因。 希望它清除。

解:

  1. URL重寫
  2. 餅干

如果您的應用程序部署在多台服務器上,則可能會在服務器之間傳輸會話。 同樣,在這種情況下,如果要在會話中存儲任何對象,則它們必須實現Serializable接口。 如果沒有,則在遷移會話時將不會保留數據。

同樣,該會話似乎與另一個會話互換了。 您是否在應用程序級別存儲任何內容? 我也建議您針對您的情況研究HttpSessionActivationListener

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM