【问题标题】:How to forward to an external url?如何转发到外部网址?
【发布时间】:2018-06-16 03:11:01
【问题描述】:

我的基于 Spring 的应用程序在 http://localhost 下运行。另一个应用程序正在http://localhost:88 下运行。我需要做到以下几点:当用户打开http://localhost/page时,应该显示http://localhost:88/content的内容。

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

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

但似乎转发到外部 URL 不起作用。

如何使用 Spring 实现这种行为?

【问题讨论】:

    标签: spring spring-mvc spring-boot forward


    【解决方案1】:

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

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

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

    更新:为了像返回内部页面一样返回外部页面的内容,我会编写一个单独的控制器方法来向 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 进行编码。

    【讨论】:

    • 感谢您的回答!关于 URL - 这只是一个错字,在实际代码中我使用了正确的 URL。我修正了我的问题中的错字。不幸的是,您的回答并没有解决我的问题。无论如何,我需要显示一个外部页面,就好像它是一个内部页面一样。我正在寻找一个不需要基于转发的解决方案。转发就是我想到的。
    • 对于您的用例,我会编写一个单独的控制器(例如 /external),它将 URL 作为查询参数,向其发出请求并返回其内容。我用一些代码更新了我的答案。
    • 谢谢,您的回答对我帮助很大!
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2012-02-16
    相关资源
    最近更新 更多