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

时间:2010-06-29 11:46:09

标签: java web-applications servlets

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

4 个答案:

答案 0 :(得分:5)

你做不到。因为“从内部”看不到“Java Web应用程序的URL”。 servlet不依赖于URL,而是从外部完成。 (也许你有一个连接到Tomcat的Apache服务器 - Tomcat无法知道它) 向HttpServletRequest询问其url是有意义的,因为我们说的是事件(实际用于生成此请求的URL)的信息,请求一个没有意义配置网址。

答案 1 :(得分:1)

解决方法可能是在第一个请求到达时执行初始化延迟。你可以实现一次过滤,例如通过在静态变量中存储boolean标志并正确同步对标志的访问。但它意味着一点开销,因为每个后续请求都将通过过滤器,然后绕过初始化。这只是一个想法。

答案 2 :(得分:1)

servlet API中没有提供此信息的任何内容,而且任何给定的资源都可能绑定到多个URL。

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

答案 3 :(得分: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;
}