Мне нужно знать порт HTTP и HTTPS, мой java webapp работает при запуске webapp - PullRequest
9 голосов
/ 20 сентября 2011

Можно ли узнать порты HTTP и HTTPS, настроенные для веб-сервера Tomcat, из java-кода веб-приложения перед выполнением любых запросов http или https.

Мне нужна эта информация при запуске приложения. Я не хочу ждать, пока кто-нибудь инициирует HTTP-запрос и вызовет getServerPort ().

Мне нужно выяснить порты HTTP и HTTPS при запуске веб-приложения.

Возможно ли это? Я очень хорошо искал эту проблему, но вряд ли нашел какие-либо решения.

Ответы [ 3 ]

5 голосов
/ 20 сентября 2011

Чтобы получить доступ к этой конфигурации во время выполнения, одним из способов является создание собственного Valve с расширением ValveBase и регистрация его в конфигурации server.xml (см. http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html) в разделе ваш Engine. Переопределите метод setContainer(Container container). Если он зарегистрирован в Engine, параметр container должен иметь тип StandardEngine. После этого вы можете вызвать getService(), чтобы получить ссылку на Service. Служба имеет метод findConnectors(). Возвращает массив экземпляров Connector, отражающий настроенные соединители (конечные точки) для вашей службы. Вы можете получить настроенный порт, позвонив getPort().

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

Если вы не хотите делать это в клапане, все становится немного грязнее, так как вам придется использовать самоанализ и нарушить видимость поля.

Это образец стандартного фильтра, который извлекает информацию о порте в методе init()

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.catalina.Container;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardEngine;
import org.apache.commons.lang3.reflect.FieldUtils;

public class TestFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        arg2.doFilter(arg0, arg1);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        ServletContext ctx = arg0.getServletContext();

        try {
            Object o = FieldUtils.readField(ctx, "context", true);
            StandardContext sCtx = (StandardContext) FieldUtils.readField(o, "context", true);
            Container container = (Container) sCtx;

            Container c = container.getParent();
        while (c != null && !(c instanceof StandardEngine)) {
            c = c.getParent();
        }

        if (c != null) {
            StandardEngine engine = (StandardEngine) c;
            for (Connector connector : engine.getService().findConnectors()) {
                // Get port for each connector. Store it in the ServletContext or whatever
                System.out.println(connector.getPort());
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

Требуется commons-lang3 (для класса FieldUtils).

0 голосов
/ 20 сентября 2011

В файле conf / server.xml, в конфигурации Connector.

Вот пример,

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP  Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" />
0 голосов
/ 20 сентября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...