我面临一个奇怪的问题:
当我提交页面控件进入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上。
问题是,当回到同一页面时,它会更改电子邮件地址字段,这是因为我甚至没有在我的机器上输入一些不同的电子邮件值,即它正在访问其他人的会话。
有人可以提供任何指针来解决此问题。由于这是生产问题,任何帮助将不胜感激。
由于
答案 0 :(得分:0)
看起来你需要使用粘性会话。这必须在apache中配置
答案 1 :(得分:0)
Http
是一个stateless
协议,意思是服务器不知道在一段时间内识别客户端。
当客户端调用服务器(负载均衡,比如server_1和server_2)时,它可以到达server_1
或server_2
,假设请求到达server_1
,现在是{ {1}}创建code
并将session
添加到会话中。
当同一个客户端再次呼叫服务器时,这次它会email
,server_2
会话中的email
不可用于server_1
和server_2
可能来自另一个server_2
的{{1}},这就是您看到另一个email
地址的原因。
希望它清楚。
答案 2 :(得分:0)
如果您的应用程序部署在多个服务器上,则可能会在服务器之间传输您的会话。此外,在这种情况下,如果要在会话中存储任何对象,则必须实现Serializable
接口。如果他们不这样做,那么迁移会话时数据将不会保留。
此外,似乎会话与另一个会话互换。您在应用程序级别存储任何内容吗? 我还建议你研究HttpSessionActivationListener你的案例。