【问题标题】:Send request to JSP and receive response向 JSP 发送请求并接收响应
【发布时间】:2012-08-14 13:41:58
【问题描述】:

我有以下将第三方应用程序集成到我的 java 应用程序中的场景。第三方应用程序运行在与我的 java 应用程序不同的上下文中。它提供了一个 JSP,需要使用某些参数(例如身份验证信息)调用该 JSP,并根据该参数生成 cookie 值并将其设置在标头中。我需要从我的 java 应用程序中调用这个 JSP,然后使用 cookie 值从响应中检索标头,并将其设置为将在我的应用程序中创建的新 cookie。

我能够调用 JSP 使用

response.sendRedirect("http://<host>:<port>/<context>/authn.jsp").

authn.jsp 能够检索所有发送的值,并生成 cookie 值。然后它会做

response.setHeader(attr,val).

但是,我不确定如何在我的 servlet 中读取此响应标头。 request.sendRedirect 是正确的方法吗?我是否需要使用 HTTPURLConnection 类来实现这一点?

【问题讨论】:

    标签: java jsp servlets response


    【解决方案1】:

    您需要使用HTTPURLConnection 来读取标题。您不能使用response.sendRedirect(..)。收到标头后,您可以在代码中设置response.setHeader(attr,val)。

    URL url = new URL("JSPURL");
    URLConnection conn = url.openConnection();
    for (int i = 0;; i++) {
      String headerName = conn.getHeaderFieldKey(i);
      String headerValue = conn.getHeaderField(i);
      System.out.println(headerName + "===");
      System.out.println(headerValue);
      if (headerName == null && headerValue == null) {
        break;
      }
    }
    

    【讨论】:

    • 请求如何使用 URLConnection 从 JSP 传回我的 servlet?
    • request 始终在您的应用程序或servlet 中。您正在建立一个 http 连接并从那里读取 headers 并在您的应用程序或 servlet 中设置您需要的标头。
    • 我能够成功打开与 JSP 的连接并接收响应标头。但是,我无法检索在 JSP 中设置的标头。我可以列出其他标头,例如服务器、日期、内容类型等,但不能列出使用 cookie 值设置的标头。我在这里错过了什么?
    • 唯一的问题是我没有设置认证信息。非常感谢!
    【解决方案2】:

    如果您使用的是 Tomcat 并且两个应用程序都部署到同一个服务器实例中,那么您可以将两个 servlet 应用程序配置为接受来自对方的传入请求。这是通过context configuration 中的crossContext 属性完成的。

    然后,您可以从您的 servlet 中对其他 Web 应用程序使用 RequestDispatcher:

    RequestDispather dispatcher = request.getRequestDispatcher("/<context>/authn.jsp");
    dispatcher.forward(request, response);
    // Process the headers
    Enumeration<String> headerNames = response.getHeaderNames();
    while(headerNames.hasMoreElements()) {
       Collection<String> values = response.getHeaders(headerNames.nextElement());
       // do whatever with the header values.
    }
    

    注意:其他 servlet 容器也有类似的配置跨上下文功能的方法,您应该查看容器的配置文档。

    【讨论】:

    • 两个应用程序部署在同一台服务器上。我可以使用 getRequestDispatcher 并将请求从我的 servlet 转发到 JSP,但是一旦将请求传递给 JSP,响应就不会返回到我的 servlet。 JSP 对其进行处理并设置标头,但由于请求未返回到我的 servlet,因此我无法将其读回。如何将响应返回给我的 servlet。我无法修改 JSP,因为它是由第三方公司提供的。
    • servlet 中的执行流程应该在 forward 调用之后继续,除非在调用目标 JSP 时抛出异常
    • 目标 JSP 没有抛出任何异常。页面末尾会抛出一条成功消息,这就是浏览器上显示的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2011-03-03
    • 1970-01-01
    • 2017-02-02
    • 2015-12-26
    相关资源
    最近更新 更多