Building an absolute URL from a relative URL in Java

后端 未结 4 1672
一向
一向 2020-12-03 14:35

I\'m having trouble building an absolute URL from a relative URL without resorting to String hackery...

Given

http://localhost:8080/myWebApp/someSer         


        
相关标签:
4条回答
  • 2020-12-03 14:46

    Using java.net.URL

     URL baseUrl = new URL("http://www.google.com/someFolder/");
     URL url = new URL(baseUrl, "../test.html");
    
    0 讨论(0)
  • 2020-12-03 14:46

    Looks like you already figured out the hard part, which is what host your are running on. The rest is easy,

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

    Should give you what you need.

    0 讨论(0)
  • 2020-12-03 14:53

    How about:

    String s = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/someImage.jpg";
    
    0 讨论(0)
  • 2020-12-03 15:06

    this code work will on linux, it can just combine the path, if you want more, constructor of URI could be helpful.

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

    if you path contain something need to escape, use URLEncoder.encode to escape it at first.

    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());
    

    example:

    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();
            }
        }
    }
    
    

    output

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

    baseUrl.getPath() are very important, don't forget it.

    a wrong example:

    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();
            }
        }
    }
    
    

    output

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

    we have lost our /first in baseurl.

    0 讨论(0)
提交回复
热议问题