【问题标题】:Session from JSP to Servlet lost (Cookie changes)从 JSP 到 Servlet 的会话丢失(Cookie 更改)
【发布时间】:2012-09-28 15:12:52
【问题描述】:

我带着同样的问题回来了,但这次记录更多。我有一个包含许多 servlet 和 JSP 的 Web 应用程序。该应用程序有一个登录选项。在 LogIn servlet 中,我开始一个新会话,在会话中放置一些信息后,我转到一个 JSP。

LogIn.java相关代码:

HttpSession sess = request.getSession(true);
sess.setAttribute("GLN", user);
rd.forward(request, response);

在我转发之后,我得到一个名为 Insert.jsp 的 Jsp 页面,我在其中获取会话属性。

插入.jsp相关代码:

HttpSession sess = request.getSession(false);
if (sess != null){
out.println(sess.getAttribute("GLN"));
}

在此之后,我有一个表单将我引导到 servlet Adaugare.java。在这里我做同样的事情:

Adaugare.java 代码:

HttpSession sess = request.getSession(false);

问题来了。 稍后编辑:这将返回 null,因为不存在会话。然后我转发到相同的 Insert.jsp 文件,即使我有 HttpSession sess = request.getSession(false);,也会创建一个与第一个不同的具有新会话 ID 的新会话。很明显 out.println(sess.getAttribute("GLN"));返回 null。

说来话长。简短版:

当我从 servlet 转到 jsp 时,会话正常,当我从 jsp 转到 servlet 时,会话无处可寻。然后当我转发到 JSP 时会创建一个新会话。实际上,它会创建一个新的 cookie。如果我从 JSP 和 serlet 打印 contextPath,它是一样的。

但奇怪的是。当我使用 mod_jk 在 apache 上运行应用程序时会发生这种情况。当我从 tomcat 运行应用程序时,它运行良好.......

请帮忙,我在这个问题上被困了 2 周。

对dan的回答:(文字很长,需要评论,需要等待7个小时才能回复我自己的问题) 我删除了所有评论的行。希望没关系。我不是负责服务器的人,但有人告诉我这不是多个工人。

worker.list=jk-status
worker.jk-status.type=status
worker.jk-status.read_only=true

worker.list=jk-manager
worker.jk-manager.type=status

worker.list=balancer
worker.balancer.type=lb

worker.balancer.error_escalation_time=0

worker.balancer.max_reply_timeouts=10

worker.balancer.balance_workers=node1
worker.node1.reference=worker.template
worker.node1.host=localhost
worker.node1.port=8109

worker.node1.activation=A

worker.balancer.balance_workers=node2
worker.node2.reference=worker.template
worker.node2.host=localhost
worker.node2.port=8209

worker.node2.activation=A

worker.template.type=ajp13

worker.template.socket_connect_timeout=5000

worker.template.socket_keepalive=true

worker.template.ping_mode=A

worker.template.ping_timeout=10000

worker.template.connection_pool_minsize=0

worker.template.connection_pool_timeout=600

worker.template.reply_timeout=300000

worker.template.recovery_options=3

【问题讨论】:

  • 您是否在 mod_jk 后面使用多个工作人员?
  • 没有多个工人。我敢打赌这是 cookie 创建的东西,但我找不到。
  • HTTPS 登录而不是其他方式?
  • 对不起,T J,我不明白这个问题...代码是从文件中复制粘贴。

标签: java jsp session servlets cookies


【解决方案1】:

如果请求在多个工作人员之间平衡,则应将会话粘性标志设置为 true。有关详细信息,请参阅:http://tomcat.apache.org/connectors-doc/reference/workers.html。你应该试试:

worker.balancer.sticky_session=True

【讨论】:

  • 我编辑了这个问题。无法在这里回复或回复我自己的问题。感谢您的帮助
  • 从您的配置中,您正在使用平衡器和多个节点(工作人员)。就像我的回答中建议的那样,请尝试设置会话粘性。
  • 我没有更改文件的服务器权限。但是服务器管理员向我保证这不是负载平衡。 workers.tomcat_home=/opt/tomcat workers.java_home=/opt/jdk ps=/worker.list=worker1 worker.worker1.port=8009 worker.worker1.host=localhost worker.worker1.type=ajp13 worker.worker1.retries =4 worker.worker1.reply_timeout=300000 worker.worker1.max_reply_timeouts=4 worker.worker1.connection_pool_timeout=60 worker.worker1.ping_mode=A worker.worker1.socket_connect_timeout=10
  • 请参阅我的链接中的“负载平衡指令”部分。在我们的例子中,不同之处在于您使用两个单独的 worker.balancer.balance_workers 条目配置工作程序(节点),通常应该如下所示:worker.balancer.balance_workers = node1, node2。
  • 所以你说我的服务器管理员错了,我使用负载平衡?所以我需要把worker.balancer.sticky_session=True放在workers.properties中?抱歉,我真的不知道 load_balancing 是做什么的,这就是我问愚蠢问题的原因
猜你喜欢
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 2015-12-07
  • 2012-02-22
  • 2011-01-13
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多