【问题标题】:How to identify the URL of an Java web application from within?如何从内部识别 Java Web 应用程序的 URL?
【发布时间】:2011-03-09 14:12:43
【问题描述】:

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

【问题讨论】:

  • 你不能。你需要它做什么?请详细说明功能需求,而不是询问如何实现一个您认为是正确解决方案但最终可能不是正确解决方案的解决方案。也许反过来可以合理地回答要求。
  • 我想发送一封包含 Web 应用程序 URL 的电子邮件。至少,上下文路径会很好。

标签: java web-applications servlets


【解决方案1】:

你不能。因为没有“从内部”看到的“Java Web 应用程序的 URL”。 servlet 不绑定到 URL,这是从外部完成的。 (也许你有一个连接到 Tomcat 的 Apache 服务器 - Tomcat 不知道) 向 HttpServletRequest 请求其 url 是有意义的,因为我们说的是一个 event 的信息(实际用于生成此请求的 URL),请求一个没有意义配置 URL。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这是它对我的工作方式,可能适用于大多数配置:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          • 2013-11-16
          • 1970-01-01
          相关资源
          最近更新 更多