如何从内部识别Java Web应用程序的URL?

3

我的Java Web应用程序包含一个启动servlet,当Web应用程序服务器(Tomcat)启动时,它的init()方法被调用。在这个方法中,我需要获取我的Web应用程序的URL。由于没有HttpServletRequest,如何获取这些信息?


3
抱歉,我无法这样做。你需要什么帮助?请详细说明功能需求,而不是询问如何实现你认为是正确解决方案但事实上可能并非正确的解决方案。也许我们可以考虑合理满足你的需求。 - BalusC
我想发送一封包含网页应用程序URL的电子邮件。至少,提供上下文路径会更好。 - Witek
4个回答

5
您无法做到这一点。因为从内部看,没有“Java Web应用程序的URL”。Servlet并不绑定于URL,这是从外部完成的。(也许您有一个连接到Tomcat的Apache服务器-Tomcat不可能知道它) 向HttpServletRequest询问其URL是有意义的,因为我们正在谈论一个事件的信息(实际上用于生成此请求的URL),但是询问配置URL是没有意义的。

1

以下是它对我以及大多数配置的工作方式:

public static String getWebappUrl(ServletConfig servletConfig, boolean ssl) {
    String protocol = ssl ? "https" : "http";
    String host = getHostName();
    String context = servletConfig.getServletContext().getServletContextName();
    return protocol + "://" + host + "/" + context;
}

public static String getHostName() {
    String[] hostnames = getHostNames();
    if (hostnames.length == 0) return "localhost";
    if (hostnames.length == 1) return hostnames[0];
    for (int i = 0; i < hostnames.length; i++) {
        if (!"localhost".equals(hostnames[i])) return hostnames[i];
    }
    return hostnames[0];
}

public static String[] getHostNames() {
    String localhostName;
    try {
        localhostName = InetAddress.getLocalHost().getHostName();
    } catch (UnknownHostException ex) {
        return new String[] {"localhost"};
    }
    InetAddress ia[];
    try {
        ia = InetAddress.getAllByName(localhostName);
    } catch (UnknownHostException ex) {
        return new String[] {localhostName};
    }
    String[] sa = new String[ia.length];
    for (int i = 0; i < ia.length; i++) {
        sa[i] = ia[i].getHostName();
    }
    return sa;
}

1
一个解决方法可以是在第一次请求到达时进行延迟初始化。您可以实现一个过滤器,在其中存储一个布尔标志,并正确同步访问该标志,以便只进行一次初始化。但它会带来一些额外开销,因为每个后续请求都将通过该过滤器,然后绕过初始化。这只是一个想法。

1

在Servlet API中没有提供这些信息,而且任何给定的资源可能绑定到多个URL。

你可以做的是,在收到实际请求时检查servlet上下文,并查看使用了哪个URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接