如何转发到外部url?

How to forward to an external url?

我的基于 Spring 的应用程序 运行 应该显示在 http://localhost. Another app is running under http://localhost:88. I need to achieve the following: when a user opens http://localhost/page, a content of http://localhost:88/content 下。

我想,我应该使用转发,如下所示:

@RequestMapping("/page")
public String handleUriPage() {
    return "forward:http://localhost:88/content";
}

但似乎无法转发到外部 URL。

如何使用 Spring 实现此行为?

首先,您指定要在您的方法中显示“http://localhost:88/content" but you actually forward to "http://localhost:88”的内容。

尽管如此,转发仅适用于相对 URLs(由同一应用程序的其他控制器提供服务),因此您应该改用 'redirect:'。

转发完全发生在服务器端:Servlet 容器将相同的请求转发到目标 URL,因此地址栏中的 URL 不会改变。 另一方面,重定向将导致服务器响应 302 并将 Location header 设置为新的 URL,之后客户端浏览器将向它发出单独的请求,更改 URL当然在地址栏中。

更新:对于return外部页面的内容,因为它将是内部页面,我会编写一个单独的控制器方法来发出请求URL 和 return 它的内容。类似于以下内容:

@RequestMapping(value = "/external", produces = MediaType.TEXT_HTML_VALUE)
public void getExternalPage(@RequestParam("url") String url, HttpServletResponse response) throws IOException {
    HttpClient client = HttpClients.createDefault();
    HttpGet request = new HttpGet(url);
    HttpResponse response1 = client.execute(request);
    response.setContentType("text/html");
    ByteStreams.copy(response1.getEntity().getContent(), response.getOutputStream());
}

当然,您有很多可能的解决方案。在这里,我使用 Apache Commons HttpClient 发出请求,并使用 Google 的 Guava 将该请求的响应复制到结果请求。 之后,您的 return 语句将更改为以下内容:

return "forward:/external?url=http%3A%2F%2Flocalhost%3A88%2Fcontent"

请注意您需要如何对作为参数给出的 URL 进行编码。