18

我在不求助于字符串黑客的情况下从相对 URL 构建绝对 URL 时遇到了麻烦...

给定

http://localhost:8080/myWebApp/someServlet

方法内部:

   public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}

什么是最“正确”的构建方式:

http://localhost:8080/myWebApp/someImage.jpg

(注意,必须是绝对的,不是相对的)

目前,我正在通过构建字符串来做到这一点,但必须有更好的方法。

我查看了新 URI / URL 的各种组合,最终得到

http://localhost:8080/someImage.jpg

非常感谢帮助

4

4 回答 4

42

使用 java.net.URL

 URL baseUrl = new URL("http://www.google.com/someFolder/");
 URL url = new URL(baseUrl, "../test.html");
于 2009-09-07T13:36:53.927 回答
4

怎么样:

String s = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/someImage.jpg";
于 2009-09-07T13:11:26.020 回答
1

看起来你已经弄清楚了困难的部分,那就是你正在运行的主机。剩下的很简单,

String url = host + request.getContextPath() + "/someImage.jpg";

应该给你你需要的。

于 2009-09-07T13:11:21.280 回答
-1

这段代码可以在linux上运行,它可以只组合路径,如果你想要更多,URI 的构造函数可能会有所帮助。

URL baseUrl = new URL("http://example.com/first");
URL targetUrl = new URL(baseUrl, Paths.get(baseUrl.getPath(), "second", "/third", "//fourth//", "fifth").toString());

如果您的路径包含需要URLEncoder.encode转义的内容,请先使用转义它。

URL baseUrl = new URL("http://example.com/first");
URL targetUrl = new URL(baseUrl, Paths.get(baseUrl.getPath(), URLEncoder.encode(relativePath, StandardCharsets.UTF_8), URLEncoder.encode(filename, StandardCharsets.UTF_8)).toString());

例子:

import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
    public static void main(String[] args) {
        try {
            URL baseUrl = new URL("http://example.com/first");
            Path relativePath = Paths.get(baseUrl.getPath(), "second", "/third", "//fourth//", "fifth");
            URL targetUrl = new URL(baseUrl, relativePath.toString());
            System.out.println(targetUrl.toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

输出

http://example.com/first/second/third/fourth/fifth

baseUrl.getPath()非常重要,不要忘记。

一个错误的例子:

import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
    public static void main(String[] args) {
        try {
            URL baseUrl = new URL("http://example.com/first");
            Path relativePath = Paths.get("second", "/third", "//fourth//", "fifth");
            URL targetUrl = new URL(baseUrl, relativePath.toString());
            System.out.println(targetUrl.toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

输出

http://example.com/second/third/fourth/fifth

我们/first在 baseurl 中丢失了。

于 2019-03-12T05:19:43.810 回答