Как определить URL-адрес веб-приложения Java изнутри? - PullRequest
3 голосов
/ 29 июня 2010

Мое веб-приложение на Java содержит загрузочный сервлет. Его метод init() вызывается при запуске сервера веб-приложений (Tomcat). В рамках этого метода мне нужен URL моего веб-приложения. Поскольку нет HttpServletRequest, как получить эту информацию?

Ответы [ 4 ]

5 голосов
/ 29 июня 2010

Вы не можете.Потому что нет «URL-адреса веб-приложения Java», как видно «изнутри».Сервлет не привязан к URL, что делается снаружи.(Возможно, у вас есть сервер Apache, который подключается к Tomcat - Tomcat не может об этом знать) Имеет смысл запросить HttpServletRequest для его URL, потому что мы говорим об информации события URL, который фактически использовался для генерации этого запроса), нет смысла запрашивать конфигурацию URL.

1 голос
/ 03 июля 2010

Вот как это работает для меня и, вероятно, для большинства конфигураций:

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 голос
/ 29 июня 2010

В API сервлета нет ничего, что предоставляло бы эту информацию, плюс любой данный ресурс может быть связан с несколькими URL-адресами.

Что вы МОЖЕТЕ сделать, так это проверить контекст сервлета при получении фактического запроса и посмотреть, какой URL был использован.

1 голос
/ 29 июня 2010

Обходным решением может быть выполнение отложенной инициализации при поступлении первого запроса.Вы можете реализовать фильтр, который делает это один раз, например, сохраняя флаг boolean в статической переменной и правильно синхронизируя доступ к флагу.Но это подразумевает небольшие накладные расходы, потому что каждый последующий запрос проходит через фильтр, который затем обходит инициализацию.Это была просто мысль.

...