我的基于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实现此行为?
答案 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进行编码。