如何转发外部网址?

时间:2018-01-06 14:22:09

标签: spring spring-mvc spring-boot forward

我的基于Spring的应用程序在http://localhost下运行。另一个应用程序在http://localhost:88下运行。我需要实现以下功能:当用户打开http://localhost/page时,应显示http://localhost:88/content的内容。

我认为,我应该使用转发,如下图所示:

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

但似乎转发到外部网址并不起作用。

如何使用Spring实现此行为?

1 个答案:

答案 0 :(得分:2)

首先,您指定要显示" http://localhost:88/content"的内容。但你实际上转发到" http://localhost:88"在你的方法中。

尽管如此,转发仅使用相对URL(由同一应用程序的其他控制器提供),因此您应该使用' redirect:'代替。

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

UPDATE :为了返回外部页面的内容,因为它是内部页面,我会编写一个单独的控制器方法来向URL发出请求并返回其内容。如下所示:

@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进行编码。