会话在Java中被覆盖

时间:2014-06-03 09:45:04

标签: java session

我面临一个奇怪的问题:

当我提交页面控件进入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上。

问题是,当回到同一页面时,它会更改电子邮件地址字段,这是因为我甚至没有在我的机器上输入一些不同的电子邮件值,即它正在访问其他人的会话。

有人可以提供任何指针来解决此问题。由于这是生产问题,任何帮助将不胜感激。

由于

3 个答案:

答案 0 :(得分:0)

看起来你需要使用粘性会话。这必须在apache中配置

答案 1 :(得分:0)

Http是一个stateless协议,意思是服务器不知道在一段时间内识别客户端。 当客户端调用服务器(负载均衡,比如server_1和server_2)时,它可以到达server_1server_2,假设请求到达server_1,现在是{ {1}}创建code并将session添加到会话中。 当同一个客户端再次呼叫服务器时,这次它会emailserver_2会话中的email不可用于server_1server_2可能来自另一个server_2的{​​{1}},这就是您看到另一个email地址的原因。 希望它清楚。

Solution:

  1. 网址重写
  2. 缓存

答案 2 :(得分:0)

如果您的应用程序部署在多个服务器上,则可能会在服务器之间传输您的会话。此外,在这种情况下,如果要在会话中存储任何对象,则必须实现Serializable接口。如果他们不这样做,那么迁移会话时数据将不会保留。

此外,似乎会话与另一个会话互换。您在应用程序级别存储任何内容吗? 我还建议你研究HttpSessionActivationListener你的案例。