【问题标题】:Java- redirecting a requestJava-重定向请求
【发布时间】:2013-08-21 11:08:58
【问题描述】:

我正在用 Java 编写一个 Servlet,基本上,它在请求正文中获取一个带有 XML 的请求,然后更改 XML 中的一些内容并使用新 XML 将请求重定向/前言到另一个不同的 Servlet在同一台服务器上,但在不同的网络应用程序上。

如何使用新的 XML 重定向/前言请求?我可以在任何地方找到代码示例吗?

这是我目前所拥有的:

protected void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
   String body = getBody(request);
   MapXml mapXml = new MapXml(body,
               "C:\\Projects\\XmlMapper\\output.xml","C:\\Projects\\XmlMapper\\output\\");
   String outputXml = mapXml.getOutputXml();
}
public static String getBody(HttpServletRequest request) throws IOException {
    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;
    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        } else {
            stringBuilder.append("");
        }
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }
    body = stringBuilder.toString();
    return body;
}

我不知道如何从这里继续。我是 servlet 世界的新手.. 谢谢!!!干杯:)

【问题讨论】:

标签: java xml jakarta-ee servlets redirect


【解决方案1】:

如果两个 web-apps 在同一台服务器上,即 Tomcat

in its META-INF/context.xml set <Context crossContext="true" />

getServletContext().getContext("/app").getRequestDispatcher("f.jsp").forward(..);, 

其中 app 是另一个应用程序的名称。

或者您可能应该做的是,使用 URLConnection 向任何 URL 发送请求。

URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...

关于如何在请求中设置XML,可以在POST请求中携带相对较大的数据量。您还可以找到 POST 数据的最大限制。

只需读取构成 XML 文件的字节(使用 FileInputStream) (如果您的文件中没有 xml,请使用 String 创建您的 xml)并发送 它们在 POST 正文中。确保设置内容编码 相应地。

我正在第四次编辑此内容,以添加更多详细信息。 如果您很难使用 Java 的 HTTP 客户端,您可以使用 Apache HTTP 客户端轻松发布 XML。

String xml = "your xml";
PostMethod post = new PostMethod(strURL);     
try {
    StringRequestEntity requestEntity = new StringRequestEntity(xml);
    post.setRequestEntity(requestEntity); ..
    ....
    ...

【讨论】:

  • 我在哪里设置它以使用新的 xml?
  • 我还没有介绍那部分。我想告诉你的就是你想问的。您应该在请求中设置 xml,然后转发它.. 或者您应该使用 URLConnection 并在请求中设置所有参数并将该请求提交到 URL ....
  • 但这是我的问题:如何在请求中设置 XML?
  • 只需读取构成 XML 文件的字节(使用 FileInputStream)(如果文件中没有 xml,请使用 String 创建您的 xml)并将它们发送到 POST 正文中。确保相应地设置内容编码。
  • 如何设置帖子正文?
【解决方案2】:

因为 xml 不会是一个小的请求体,所以你必须让客户端为你发布新的 xml。或者你可以这样做:

  1. 与远程Web服务共享同一个数据库或缓存,并转发数据库或缓存中数据的key。

  2. 使用 HttpClient 为您的客户端发布请求,并使用修改后的 xml,并将远程服务的响应返回给您的客户端。

如果你能确定xml body很小,你可以只使用GET方法,将请求转发到远程服务器

【讨论】:

  • 这对我没有帮助 - 没有涉及数据库
  • 如何使用 HttpClient 为您的客户发布请求?并返回响应。
  • 例子?我不确定你的意思
  • HttpClient 是 apachelink 提供的一套工具,它通过 java 代码像浏览器一样发送请求。演示在这里link
【解决方案3】:

我们先排除一些可能性:

  1. 您不能使用response.sendRedirect("/otherapp/servlet.do"),因为它不允许您将 POST 数据发送到另一个 web 应用。
  2. 您不能使用session,因为您将数据发送到不同的网络应用程序。
  3. 您显然不能使用 GET 在查询字符串中传递完整的 XML。

一旦排除了这些可能性,我能想到的唯一可能的方法就是:

  1. 返回调用页面,修改后的 XML 和其他 webapps servelt 的 URL 作为响应
  2. 让调用页面立即使用简单的 Javascript 将修改后的 XML POST 到其他 webapps 的服务器

【讨论】:

  • 问题是否提到了不同的 Webapp?我猜它只是在同一台服务器上不同的 Servlet/JSP。
  • 这是 OP 写的:The new XML to a different Servlet that's on the same server, but its on a different web app.
  • 您可以通过谷歌搜索轻松找到代码sn-p。为此,您需要基本的 Javascript 知识。
猜你喜欢
  • 2017-04-25
  • 2015-06-24
  • 2014-05-19
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多