java - “陷害”tomcat6 丢失 session

标签 java jsp session tomcat6 genesys

IWS 是一个桌面应用程序,具有自己的 WebBrowser 组件,可在需要时调用脚本 Web 应用程序。脚本位于 Tomcat6 中。

脚本基本上是一个 JSP 应用程序。 (实际上,它是一个引擎,通过图形界面上的人类操作构建 JSP 应用程序,例如定义流程、按钮、内容等,但我说的是它作为 JSP 生成的“脚本”)

我需要破解脚本,以便它可以在 IWS 应用程序的 webBrowser 组件中共享空间(通过框架)。

IWS 调用 start.jsp 2 次:

  • 第一次,以隐藏方式(可能是来自 IWS 代码的直接 http 查询),没有任何特殊参数。原始的 start.jsp 执行了 2 302(因此调用总共访问了 3 个页面),它最终使用 cookie 中的 jsesionId 和作为参数(但不是在最后 302)

  • 第二次,使用 jSessionId 和一堆重要参数。它仅使用 jSessionId 作为参数。据我在fiddler中看到的,当它正常工作时不会使用cookie,因为jsessionId在它自己的内部

所以我猜第一次 ìt 只是为了获得一个新的 jSessionId。

我现在尝试的解决方案是将脚本起始页面替换为新的框架页面,该页面在它所包含的两个框架之一中加载 Web 应用程序,并在第二个框架中加载另一个应用程序。根据第一帧的数据,它将更新第二帧。

所以类似:

  • 我们有 start.jsp...(实际上它的名称不同)

  • 我们以以下内容结尾:

    • start.app.jsp(原来的start.jsp,只是重命名)

    • start.jsp(是新的,包括包装以前的 start.jsp 的 html)

新的 start.jsp 使用自己的 url,将 start.jsp 更改为 start.app.jsp,以调用 iframe 内真正的脚本应用程序。

但我一直遭受类似的 session 问题。我不是 tomcat 方面的专家。我了解到它通过 cookie 或参数控制 session 。我认为它配置为与 URL sessionId 一起使用,但我不太确定。我已将 META-INF/settings.xml 设置为禁用 session 中的 cookie 使用,但它仍然在 cookie 列表中显示 cookie。

我的问题是,在第二次调用 start.jsp 时,它看起来像是正在使用“旧 cookie”,忽略了 URL 中的 jsessionId。 WWG00000E 处出现一些奇怪的错误:WWGAIL - 错误:未为函数 getInteractionKVPair 提供 ID 详细信息:

这就像它正在返回带有另一个 jsessionid 的旧 cookie。每次出现错误时,“旧”jsessionid 都是相同的。

用 fiddler 嗅探,我看到第二个 start.jsp 以 URL 中正确的 jsessionId 开头,但它的 cookie 就像来自另一个 session ,并且它停止在每次重定向时添加 jsession id,因为发生这种情况。就像是在一个完全不同的宇宙中执行一样。这是正常的吗???

目前,我正在尝试强制 cookie jSessionId 和链接,以便它们包含 jSessionId,但没有成功。

请问你有什么想法吗?

谢谢!

Edited2:如果我将其放置在没有框架的情况下(恢复默认的start.jsp)。在 IWS 中,仅在第一次(交互)时有效,而在任何后续操作中,问题都会开始出现......

最佳答案

好的,终于解决了...

至少对于这个版本的 Tomcat:

  • 调用不带 jSessionId 的 jsp 会在您的应用 cookie 中创建一个新的 jSessionId。
  • 任何进一步的及时 html 请求都将使用 cookie jSessionId 而不是 URL 上存在的 cookie,因此您将失去任何类型的多 session 支持。

这比在 webBrowser 组件中比较特别,做了两步连接,第一个请求永远不会有关联的 cookie,所以它工作正常,给你一个带有新 jSessionId 的 cookie,然后你可以做一个新的,无 cookie,第二个请求使用 URL 的 jSessionId,并且没有 cookie 或具有不带 jSessionId 的“默认”cookie。当这个 webBrowser 请求一个在其 URL 中没有 jSessionId 的 jsp 页面时,如上所述,问题就开始了,所以如果第一个请求包含非 jSessionIded 调用,Tomcat 会给你一个在你的“默认应用程序 cookie”上设置的 jSessionId,所以第二个请求请求会忽略任何 URL jSessionId 以使用该 cookie 上的 jSessionId。

在网络浏览器中,我观察到至少在 Firefox 中,清理 cookie 不足以消除这个“默认 cookie”。但也许这就是经典的“时间太长,所以你认为它很干净,但实际上并非如此”。不确定。

我知道这听起来很困惑。我没有时间对此进行进一步的测试。

据我所知,当它工作正常时,它就像使用“ session cookie”(不带jSessionId)一样工作,而当它不工作时,它会使用“默认cookie”(带jSessionId) )并开始忽略 URL jSessionId。

我已经向 Tomcat 的开发邮件列表发送了一封电子邮件。 (有人说正确的位置是用户邮件列表...但你在这里;-))

关于java - “陷害”tomcat6 丢失 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44244853/

相关文章:

node.js - 如何通过 BrowserSync 中间件设置 session cookie?

java - 将日期时间转换为字符串,时间错误

java - 这个 add() 函数如何工作,为什么返回 null?

java - 无法将 "#{bean.color}"转换为 bean javax.el.ValueExpression 的属性颜色

java - 如何使用 Servlet 和 JSP 在数据库中提交插入之前获得用户确认?

java - 在 JSF 表达式语言中如何获取列表的长度?

java - 使用 JPA 和 Hibernate 时 DISTINCT 是如何工作的

java - 使用 start.spring.io 的 spring 项目 stub 在没有 xml-conf 的情况下交付 jsp View 的最快方法

Java Ganymed Trlead Orion ssh session 超时

asp.net - ASP.NET MVC 中的 session cookie 持久性