【问题标题】:Servlet Session HTTPClientServlet 会话 HTTPClient
【发布时间】:2010-08-13 16:14:06
【问题描述】:

我得到了一个 Servlet A,其中配置了一个 HTTPClient - 声明了一个调用 Servlet B 的 GetMethod(基本上将 url 传递给 Servlet B 的构造函数。

在 Servlet B 中,我设置了一些会话变量,当 Servlet A 在“执行”方法后取回控制权但在 Servlet B 中设置的会话变量返回为空时。

小服务程序 A

doPost(req,res)
      {
         HTTPClient client = new HTTPClient();
         GetMethod get =  new GetMethod("/ServletB.do");
         client.execute(get);

         System.out.println("Value of a is :: " + session.getAttribute("a")) ; //gives a NULL
}

小服务程序 B

doPost(req,res)
{
HTTPSession session = req.getSession();
session.setAttibute("a",a);
session.setAttibute("b",b);

}

您能告诉我我有哪些选择可以解决这个问题吗?

【问题讨论】:

    标签: session servlets httpclient


    【解决方案1】:

    您的代码至少有两个问题:

    • 您需要在 HTTP 请求中将会话 id 从 servlet A 传递给 servlet B。会话 id 在客户端和服务器之间的传递方式是特定于容器的,但通常会话 id 作为 HTTP cookie 传递.

    • 如果多个 servlet 同时访问同一个会话并且其中一个 servlet 添加或替换新属性,则 servlet 规范不保证会话属性的更改立即对所有 servlet 可见。

    您最好的选择可能是将 servlet B 中的业务逻辑移动到一个单独的类中,并从 servlet A 或 servlet B 中使用该类。或者您是否有其他奇怪的原因从一个 servlet 向一个在同一个 Web 应用程序中使用不同的 servlet,而不是简单地进行方法调用?

    【讨论】:

      【解决方案2】:

      我可以看到您正在调用从 A 执行“get”,而您已经给出了在 B 中处理“post”的代码。

      此外,您用于使用session.getAttribute("a")) 检索参数的会话与 B servlet 看到的“会话”不同。

      【讨论】:

        【解决方案3】:

        正确的解决方案取决于这些 servlet 实际运行的位置。

        • 如果这些 servlet 在 same 网络服务器 servletcontext 上运行,则只需使用 RequestDispatcher#include()。他们将可以访问完全相同的会话。

          request.getRequestDispatcher("/anotherservlet").include(request, response);
          
        • 如果这些 servlet 在相同 web 服务器上运行,但 不同 servletcontext,则考虑共享会话,以便它们共享完全相同的会话。目前还不清楚您使用的是什么 servletcontainer,所以这里只是一个以 Tomcat 为目标的示例,为您提供一些提示。只需将两个 webapp 上下文的 crosscontext 属性设置为 true

          <Context crossContext="true">
          
        • 如果这些 servlet 在不同网络服务器上运行,那么您需要将感兴趣的数据作为请求参数传递。那是你最好的选择,真的。他们不会也不能共享同一个会话,这将是一个安全漏洞。

          new GetMethod("http://example.com/ServletB.do?name1=value1&name2=value2");
          

          如果数据比较大,那么考虑共享数据库,这样你只需要传递PK值作为请求参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-14
          • 2011-05-06
          • 2011-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-21
          相关资源
          最近更新 更多