【问题标题】:Session handling on Java EE applicationJava EE 应用程序上的会话处理
【发布时间】:2011-07-26 14:32:29
【问题描述】:

我正在开发一个系统来处理客户商户系统收到的金融交易,它是我们从供应商处购买的现有系统的替代品。客户端界面应从我们的系统调用用户身份验证和交易处理屏幕。

系统功能如下,

  1. 从商家站点接收输入参数
  2. 验证它
  3. 验证用户身份(用户已在我们的系统中注册,我们应该调用我们的登录屏幕)
  4. 处理事务
  5. 向商家返回状态响应

收到响应后,客户端应根据驻留在会话中的值验证事务数据。

系统概述如下,

(click here for full size image)

我的问题是一旦我们响应客户端,客户端就无法保留会话。但是我们从供应商那里购买的系统可以实现相同的功能(我们没有源代码来分析内部编码结构)。我希望我们回应客户的方式有问题。

我该如何克服这个问题?

我们使用的是 Java 1.4.2,Websphere 应用服务器

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

    有很多事情可以使会话消失。我建议跟踪他们并验证是否一切正常。如果您understand 会话的工作方式,这将更容易做到。

    • 会话已超时。这通常默认为 30 分钟。这可以通过<session-timeout>web.xml 中配置,您可以在其中指定超时时间(以分钟为单位)。您可以使用记录器实现HttpSessionListener 来跟踪会话的创建和销毁。

    • 会话已被强制无效。当代码调用HttpSession#invalidate() 时会发生这种情况。这也可以通过HttpSessionListener 进行跟踪。

    • 会话 cookie 已消失。会话由 cookie 支持。如果创建了会话,服务器将添加带有会话 ID 的 Set-Cookie 标头。客户端应在Set-Cookie 标头中指定的(上下文)路径上的所有后续请求中将与Cookie 标头相同的cookie 发送回。这可以在浏览器内置 Web 开发工具集的 HTTP 流量监视器(“网络”选项卡)中进行跟踪(在 Chrome/Firefox23+/IE9+ 中按 F12)。同一 cookie 域上的所有 webapp 都可以访问 cookie。此外,如果 ServletC2 在与 ServletC1 不同的 webapp 上下文中运行,则它不会使用相同的会话。此外,如果“服务器”网络应用程序在同一个域上运行,那么理论上它能够清除“客户端”网络应用程序的所有 cookie。

    • 客户端不支持 cookie。设计良好的 Web 应用程序使用带有 jsessionid 的 URL 重写来跟踪同一 Web 应用程序上请求之间的无 cookie 客户端。但是当重定向回第一个 web 应用程序时,第二个 web 应用程序必须这样做。

    【讨论】:

    • 感谢您的解释,我喜欢您的回答清晰。您能否详细说明您所描述的第三点。有没有办法让servletC1 的sessionId 进入servletS1Set-Cookie,并在servletS2 的响应中使用该ID?
    • jsessionid重写网址不是安全漏洞吗?您将会话 ID 公开给可能不知情的用户。是否有额外的安全机制?
    • @fnst:如果用户在公共场合共享 URL 并且只要用户的会话仍处于活动状态,该链接就被其他人使用,这只是一个漏洞。没有额外的安全机制。您可以借助 servlet 过滤器或自定义会话管理器自己创建“IP 锁”。
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 2011-11-28
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2011-07-22
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多