我目前正在使用OpenID4Java库使用Java HttpServlet实现OpenID依赖方(RP)和身份提供程序(IdP)。我遇到了让两个servlet相互通信的麻烦。我相信我遇到的问题是如何更好地处理Servlets的行为,但是我已经包含了有关我的应用程序的信息,以便更好地了解正在发生的事情。
方案如下:
Servlet#1(我的RP)向Servlet#2(我的IdP)发送请求,如下所示:
httpResp.sendRedirect(authReq.getDestinationUrl(true));
基本上authReq =具有各种OpenID特定参数的消息。通过调用getDestinationUrl(true),它将请求编码为URL以通过GET发送。
Servlet#2在其doGet方法中捕获上述GET。它解析信息,并以下列方式制作回复发送回Servlet#1:
String responseText = processRequest(httpReq,httpResp);
httpResp.setContentType("text/html");
OutputStream outputStream = httpResp.getOutputStream();
//
outputStream.write(responseText.getBytes());
outputStream.close();
我的问题是,这个响应永远不会回到Servlet#1。我希望当Server#1收到来自Servlet#2的响应时,它的'doGet或doPost方法会捕获该消息。但是两种情况都不会发
非常感谢任何建议。
谢谢!
答案 0 :(得分:1)
第二个servlet的响应将直接在客户端进行,我认为因为它是原始客户端吗?您的第一个servlet只是重定向请求。
因此,如果要在servlet之间进行通信,请使用URLConnection
或Apache HttpClient
与第二个servlet进行通信。
您也可以创建JSP而不是第二个servlet,然后将数据从第一个servlet传递给该JSP。那个JSP的响应将被发送给客户端。毕竟,您可以在JSP中使用servlet中的所有逻辑。
希望这有帮助。
PARTH。
答案 1 :(得分:0)
如果您希望两个servlet在应用程序中相互通信,您可以使用ServletContext对象并通过ServletContext.setAttribut
e和ServletContext.getAttribute
以及通过HttServletRequest
或{获得的RequestDispatcher来共享数据{1}}
在您的情况下,客户端可以直接调用Servlet#2吗?如果没有,那么您应该将processRequest(请求,响应)重构为Utility类或库。反过来,Servlet#1和Servlete#2都可以调用它。
ServletContext
向浏览器发送重定向(301透视,ithink)。因此,您的servlet实际上向301发送了一个响应,然后浏览器再次向servlet#2发出请求。
答案 2 :(得分:0)
您可以使用RequestDispatcher包含第二个servlet的响应。这样,控制在方法完成后返回第一个servlet。
RequestDispatcher dispatcher = request.getRequestDispatcher(authReq.getDestinationUrl(true));
dispatcher.include(request, response);
但是,这样,被调用的servlet生成的响应将被发送到浏览器。如果你希望你的调用servlet从被调用的servlet捕获消息而不发送到浏览器,你可以创建一个响应包装器(一个包装器在字符串中写入内容)并在你包含第二个servlet时传递这个包装器或者你可以分享更好的包装器任一范围内的数据(最好是'request'范围):您可以在被调用的servlet中设置请求范围中的数据,并且可以在include()完成后在调用servlet中检索它。
重定向时,您告诉浏览器对URL发出新请求。因此,会创建新的请求/响应对象,就好像您单击了页面中的链接一样。
希望这有帮助。