2010-08-13 46 views
0

我其中有一个Servlet技术的一个了HTTPClient在它配置 - 宣布GetMethod它调用Servlet的B(基本合格的URL的Servlet B的构造函数”Servlet会话了HTTPClient

在Servlet的BI正在设置一些会话。 VAR和当在Servlet甲回来进行控制的“执行”的方法之后,但是在会话中乏的Servlet乙设定正在返回空。

的Servlet甲

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 
} 

的Servlet乙

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

} 

您能否让我知道我的选择在这里解决这个问题?

回答

0

我可以看到你调用执行从一个“让”,而你在B中给出的处理代码“后”您正在使用使用session.getAttribute("a"))检索参数

而且会比“会话”不同由B servlet看到。

2

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

  • 您需要通过从Servlet中生成会话ID的HTTP请求的servlet B.如何会话ID在客户端和服务器之间传递是特定于容器的,但通常会话ID是作为HTTP cookie传递的。

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

你最好的选择可能是在servlet的B中的业务逻辑转移到一个单独的类和使用该类来自servlet的一个或servlet B.或者你有其他一些奇怪的原因作出的HTTP调用一个servlet到同一个web应用程序中的不同servlet,而不是简单地进行方法调用?

0

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

  • 如果这些小服务器在同一Web服务器ServletContext的运行,那么就使用RequestDispatcher#include()。他们将有权访问完全相同的会话。

    request.getRequestDispatcher("/anotherservlet").include(request, response); 
    
  • 如果这些小服务器在同一Web服务器运行,但不同 ServletContext中,然后再考虑共享会话,让他们将共享完全相同的会话。目前还不清楚你使用的是什么servletcontainer,所以这里只是一个以Tomcat为目标的例子,给你一些提示。就在双方的webapp contexs的crosscontext属性设置为true

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

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

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