1

我目前正在使用 OpenID4Java 库通过 Java HttpServlets 实现 OpenID 依赖方 (RP) 和身份提供者 (IdP)。我在让两个 servlet 相互通信时遇到了麻烦。我相信我遇到的问题是更多地处理 Servlet 的行为方式,但是我已经包含了有关我的应用程序的信息,以便更好地了解正在发生的事情。

场景如下:

Servlet #1(我的 RP)向 Servlet #2(我的 IdP)发送请求,如下所示:

httpResp.sendRedirect(authReq.getDestinationUrl(true));

本质上 authReq = 带有各种 OpenID 特定参数的消息。通过调用 getDestinationUrl(true),它将请求编码为 url 以通过 GET 发送。

Servlet #2 在其 doGet 方法中捕获上述 GET。它解析信息,并以下列方式制作回复以发送回 Servlet #1:

字符串 responseText = processRequest(httpReq, httpResp);

        httpResp.setContentType("text/html");
        OutputStream outputStream = httpResp.getOutputStream();
        //
        outputStream.write(responseText.getBytes());
        outputStream.close();

我的问题是,这个响应永远不会回到 Servlet #1。我希望当服务器 #1 收到来自 Servlet #2 的响应时,它的 doGet 或 doPost 方法会捕获该消息。然而,这两种情况都没有发生。

任何建议将不胜感激。

谢谢!

4

3 回答 3

1

我认为第二个 servlet 的响应将直接在客户端进行,因为它是原始客户端,对吗?您的第一个 servlet 只是重定向请求。

因此,如果您想在 servlet 之间进行通信,请使用URLConnectionorApache HttpClient与第二个 servlet 进行通信。

您还可以制作 JSP 而不是第二个 servlet,然后将数据从第一个 servlet 传递给该 JSP。然后该 JSP 的响应将被发送到客户端。毕竟,您可以在 JSP 中执行您在 servlet 中可以执行的所有逻辑。

希望这可以帮助。

部分。

于 2010-07-30T06:51:41.493 回答
0

如果你想让两个 servlet 在一个应用程序中相互通信,你可以使用 ServletContext 对象并通过ServletContext.setAttributeServletContext.getAttribute和 RequestDispatcher 共享数据,通过HttServletRequestorServletContext

在您的情况下,客户端可以直接调用 Servlet#2 吗?如果不是,那么您可能应该将 processRequest(request, response) 重构为实用程序类或库。Servlet#1 和 Servlet#2 又可以调用它。

response.sendRedirect向浏览器发送重定向(永久移动 301,ithink)。因此,您的 servlet 实际上使用 301 向浏览器发送响应,然后浏览器再次向 servlet#2 发出请求。

于 2010-07-30T07:13:02.340 回答
0

您可以使用 RequestDispatcher 来包含您的第二个 servlet 的响应。这样,控制在方法完成后返回到第一个 servlet。

RequestDispatcher dispatcher = request.getRequestDispatcher(authReq.getDestinationUrl(true));
dispatcher.include(request, response);

但是,这样,被调用的 servlet 生成的响应将被发送到浏览器。如果您希望调用 servlet 从被调用 servlet 捕获消息而不发送到浏览器,则可以创建一个响应包装器(将内容写入字符串的包装器)并在包含第二个 servlet 时传递此包装器,或者更好地共享任一范围内的数据(最好是“请求”范围):您可以在被调用的 servlet 中设置请求范围内的数据,并且可以在 include() 完成后在调用 servlet 中检索它。

重定向时,您是在告诉浏览器对 URL 发出新请求。因此,将创建新的请求/响应对象,就好像您单击了页面中的链接一样。

希望这可以帮助。

于 2010-07-30T07:42:33.813 回答