Миграция Jetty 6.1 до 9.3 имеет несколько проблем - PullRequest
0 голосов
/ 12 июня 2018

Привет Всем нужно несколько предложений при переносе нашего унаследованного приложения со встроенным сервером Jetty 6.1.

Я пытаюсь перейти на Jetty 9.3, да, после долгого перерыва и после решил перейти наJAVA 8. При изменении нескольких файлов я сталкиваюсь с фрагментом кода, написанным на пристани 6.1.

Код:

@Override
    public void initialize(final ServiceConfiguration genericConfig, final Controller controller, final int serviceId,
        final ServiceLock lock) throws Exception {
        if (genericConfig instanceof JettyServerConfiguration) {
            configuration = (JettyServerConfiguration) genericConfig;
        } else {
            configuration = XmlConfigurable.createInstance(JettyServerConfiguration.class,
                    genericConfig.getXmlConfigElement());
        }

        server = new Server();
        log.info("jetty version = " + Server.getVersion()); //frozen

        maxWaitForSlave = getConfiguration().getMaxWaitForSlave();

        final boolean debug = getConfiguration().getMortBayDebug();
        log.info("mortbay debug = '" + debug + "'"); //frozen
        org.mortbay.log.Log.getLog().setDebugEnabled(debug);

        // Configure http
        final boolean httpEnabled = getConfiguration().getHttpEnabled();

        if (httpEnabled) {
            // Setup http connector as nio or socket.
            final boolean nio = getConfiguration().getNioEnabled();
            Connector connector;

            if (nio) {
                connector = new SelectChannelConnector();
            } else {
                connector = new SocketConnector();
            }

            final int mainPort = getConfiguration().getHttpPort();

            log.info("adding default connector on port '" + mainPort + "'"); //frozen
            connector.setPort(mainPort);

            server.addConnector(connector);
        }

        // Configure SSL
        final boolean sslEnabled = getConfiguration().getSslEnabled();

        if (sslEnabled) {
            final int sslPort = getConfiguration().getSslPort();
            final String sslKeyStore = getConfiguration().getSslKeyStore();
            final String sslPassword = getConfiguration().getSslPassword();
            final String sslKeyPassword = getConfiguration().getSslKeyPassword();
            final String sslTrustPassword = getConfiguration().getSslTrustPassword();

            //final boolean nio = configuration.getBooleanValue("NioEnabled", false); //frozen
            //if(nio) {
            //sslConnector = new SslSelectChannelConnector();  available in jetty 7
            //} else {
            final SslSocketConnector sslConnector = new SslSocketConnector();
            sslConnector.setKeystore(sslKeyStore);
            sslConnector.setTruststore(sslKeyStore);
            sslConnector.setPassword(sslPassword);
            sslConnector.setKeyPassword(sslKeyPassword);
            sslConnector.setTrustPassword(sslTrustPassword);
            sslConnector.setPort(sslPort);
            log.info("adding ssl connector on port '" + sslPort + "'"); //frozen
            server.addConnector(sslConnector);

            //}
        }

        // Check we had 1 connector else the server is useless
        if (server.getConnectors().length == 0) {
            throw new FileNotFoundException("No connectors registered.  Please see HttpEnable or SslEnable XML tags."); //frozen
        }

        // Configure the handlers
        final HandlerCollection handlers = new HandlerCollection();

        for (final WebAppContext webAppContext : getConfiguration().getWebAppContexts()) {
            log.info("Adding WebAppContext " + webAppContext.getWar() + " at " + webAppContext.getContextPath()); //frozen
            handlers.addHandler(webAppContext);
        }

        // See http://docs.codehaus.org/display/JETTY/Logging+Requests
        final boolean accessLogEnabled = getConfiguration().getLogEnabled();

        if (accessLogEnabled) {
            final RequestLogHandler requestLogHandler = new RequestLogHandler();
            final File logDir = ServiceUtilities.getLogDirectory();

            if (!logDir.exists()) {
                logDir.mkdirs();
            }

            final File logFile = new File(getConfiguration().getLogFormat());

            if (!logFile.getParentFile().exists()) {
                logFile.getParentFile().mkdirs();
            }

            final NCSARequestLog requestLog = new NCSARequestLog(getConfiguration().getLogFormat());
            requestLog.setRetainDays(getConfiguration().getLogRetain());
            requestLog.setAppend(getConfiguration().getLogAppend());
            requestLog.setExtended(getConfiguration().getLogExtended());
            requestLog.setLogTimeZone(getConfiguration().getLogTz());
            requestLog.setLogLatency(getConfiguration().getLogLatency());
            requestLogHandler.setRequestLog(requestLog);
            handlers.addHandler(requestLogHandler);
        }

        handlers.addHandler(new DefaultHandler());

        server.setHandler(handlers);

        server.setUserRealms(new UserRealm[] { new OSMUserRealm() });

        JettyServerInfo.install(server);

        super.initialize(configuration, controller, serviceId, lock);
    }

После предложения, приведенного ниже, у меня естьпереписать это так:

@Override
public void initialize(final ServiceConfiguration genericConfig, final Controller controller, final int serviceId,
    final ServiceLock lock) throws Exception {
    if (genericConfig instanceof JettyServerConfiguration) {
        configuration = (JettyServerConfiguration) genericConfig;
    } else {
        configuration = XmlConfigurable.createInstance(JettyServerConfiguration.class,
                genericConfig.getXmlConfigElement());
    }

    server = new Server();
    log.info("jetty version = " + Server.getVersion()); //frozen

    maxWaitForSlave = getConfiguration().getMaxWaitForSlave();

    final boolean debug = getConfiguration().getMortBayDebug();
    log.info("mortbay debug = '" + debug + "'"); //frozen
    //org.eclipse.jetty.util.log.Log.getLog().setDebugEnabled(debug);


        //Re-writing code for Jetty 9.3
        final int mainPort = getConfiguration().getHttpPort();//8580
        final int sslPort = getConfiguration().getSslPort(); //8581
        final String sslKeyStore = getConfiguration().getSslKeyStore();
        final String sslPassword = getConfiguration().getSslPassword();
        final String sslKeyPassword = getConfiguration().getSslKeyPassword();
        final String sslTrustPassword = getConfiguration().getSslTrustPassword();
        //Added for  Jetty 9.3
        final KeyStore trustKeyStore=KeyStore.getInstance(getConfiguration().getSslKeyStore());

        ClassLoader cl = JettyServer.class.getClassLoader();// Get the class loader for my current class which is JettyServer
        String keystoreResource = "ssl/keystore";
         URL f = cl.getResource(keystoreResource);

         if (f == null)
         {
             throw new RuntimeException("Unable to find " + keystoreResource);
         }

         // Setup HTTP Connector
         HttpConfiguration httpConf = new HttpConfiguration();
         httpConf.setSecurePort(mainPort);
         httpConf.setSecureScheme("https");

         // Establish the HTTP ServerConnector
         ServerConnector httpConnector = new ServerConnector(server,
                 new HttpConnectionFactory(httpConf));
         httpConnector.setPort(mainPort);
         server.addConnector(httpConnector);

         // Setup SSL
        SslContextFactory theSSLFactory = new SslContextFactory();

        theSSLFactory.setKeyStorePath(f.toExternalForm());  //replaced for--> theSSLFactory.setKeyStorePath(sslKeyStore);
        theSSLFactory.setKeyManagerPassword(sslPassword);  // or this one ? seems hardcoded --> sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
        theSSLFactory.setKeyStorePassword(sslKeyPassword); // or this one ? seems hardcoded --> sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
        theSSLFactory.setTrustStore(trustKeyStore);
        theSSLFactory.setTrustStorePassword(sslTrustPassword);

        // Setup HTTPS Configuration
        HttpConfiguration httpsConf = new HttpConfiguration(httpConf);
        httpsConf.addCustomizer(new SecureRequestCustomizer()); // adds ssl info to request object

     // Establish the HTTPS ServerConnector
        ServerConnector httpsConnector = new ServerConnector(server,
                new SslConnectionFactory(theSSLFactory,"http/1.1"),
                new HttpConnectionFactory(httpsConf));
        httpsConnector.setPort(sslPort);

        log.info("adding ssl connector on port '" + sslPort + "'"); //frozen
        server.addConnector(httpsConnector);



    // Check we had 1 connector else the server is useless
    if (server.getConnectors().length == 0) {
        throw new FileNotFoundException("No connectors registered.  Please see HttpEnable or SslEnable XML tags."); //frozen
    }

    // Configure the handlers
    final HandlerCollection handlers = new HandlerCollection();

    for (final WebAppContext webAppContext : getConfiguration().getWebAppContexts()) {
        log.info("Adding WebAppContext " + webAppContext.getWar() + " at " + webAppContext.getContextPath()); //frozen
        handlers.addHandler(webAppContext);
    }

    // See http://docs.codehaus.org/display/JETTY/Logging+Requests
    final boolean accessLogEnabled = getConfiguration().getLogEnabled();

    if (accessLogEnabled) {
        final RequestLogHandler requestLogHandler = new RequestLogHandler();
        final File logDir = ServiceUtilities.getLogDirectory();

        if (!logDir.exists()) {
            logDir.mkdirs();
        }

        final File logFile = new File(getConfiguration().getLogFormat());

        if (!logFile.getParentFile().exists()) {
            logFile.getParentFile().mkdirs();
        }

        final NCSARequestLog requestLog = new NCSARequestLog(getConfiguration().getLogFormat());
        requestLog.setRetainDays(getConfiguration().getLogRetain());
        requestLog.setAppend(getConfiguration().getLogAppend());
        requestLog.setExtended(getConfiguration().getLogExtended());
        requestLog.setLogTimeZone(getConfiguration().getLogTz());
        requestLog.setLogLatency(getConfiguration().getLogLatency());
        requestLogHandler.setRequestLog(requestLog);
        handlers.addHandler(requestLogHandler);
    }

    handlers.addHandler(new DefaultHandler());

    server.setHandler(handlers);

    server.setUserRealms(new UserRealm[] { new OSMUserRealm() });

    JettyServerInfo.install(server);

    super.initialize(configuration, controller, serviceId, lock);
}

Тем не менее я не уверен, что делать с этой строкой.

server.setUserRealms (новый UserRealm []{new OSMUserRealm ()});

Я не нашел альтернативного метода в Jetty 9.3 для UserRealm, есть предложения, как мне переписать эту строку кода?

1 Ответ

0 голосов
/ 12 июня 2018

Напоминание: версия для Jetty (с 1995 года) - <servlet_support>.<major_version>.<minor_version>

Поздравляю, вы, по сути, пропустили 14 основных версий в Jetty.: -)

Не удивительно, что это кажется таким пугающим.

решил перейти на JAVA 8

Знай, что Январь 2019 года - последнийдень Java 8 публичных обновлений .Это практически конец жизни для неоплачиваемых клиентов-оракулов.

Примечание: Java 9 уже устарела / не поддерживается.

Поскольку вы упоминаете использование SSL / TLS, оно составляет Обязательно обновляйте JVM и не используйте устаревшую JVM (требования к браузеру и TLS).

Рассмотрите возможность обновления (снова) до Java 11 до этого года (2018 г.)) окончен.

Цикл обновления для Java ускоряется, не ожидайте, что версии Java будут задерживаться годами.Основные версии не должны длиться более 6 месяцев (в настоящее время).

log.info ("mortbay debug = '" + debug + "'");// заморожено org.eclipse.jetty.util.log.Log.getLog (). setDebugEnabled (debug);

Ведение журнала не работает так.

Это зависит отвыбранная реализация (теперь есть SLf4j, java.util.logging и System.err).Использование Log.getLog() дает вам корневой фасад ведения журнала, а использование setDebugEnabled() на фасаде - это просто настройка отладки на фасаде, а не реальных регистраторов.

Используйте правильную реализацию ведения журнала и именованные регистраторы.

if (nio) {connector = new SelectChannelConnector (сервер);} else {
connector = новый SocketConnector (сервер);}

Больше нет блокирующих разъемов, он на 100% основан на NIO (для последних 5 основных версий)

Добро пожаловать в мир современных веб-протоколов.

Прошли те времена, когда соединитель обслуживал только один протокол, теперь все согласовывается во время фактического соединения.

Например: Connect, TLS, ALPN, HTTP / 2, HTTP / 1.1 с TLS, HTTP / 1.1 без TLSи т. д. (И вся информация, передаваемая при согласовании TLS одного соединения, также используется для определения того, с каким веб-приложением вы общаетесь, с каким хостом и какими сертификатами и т. д.)

Роль ServerConnector заключается втолько для прослушивания порта, фабрики соединений, которые вы назначаете для ServerConnector, определяют, что делать с этим соединением.

Прочитайте различные примеры кода для этого.

См .:

Упрощенный пример:

    Server server = new Server();
    int httpsPort = 8443;

    // Find Keystore
    ClassLoader cl = ServerConnectorHttps.class.getClassLoader();
    String keystoreResource = "ssl/keystore";
    URL f = cl.getResource(keystoreResource);
    if (f == null)
    {
        throw new RuntimeException("Unable to find " + keystoreResource);
    }

    // Setup SSL
    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.setKeyStorePath(f.toExternalForm());
    sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
    sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");

    // Setup HTTPS Configuration
    HttpConfiguration httpsConf = new HttpConfiguration();
    httpsConf.setSecurePort(httpsPort);
    httpsConf.setSecureScheme("https");
    httpsConf.addCustomizer(new SecureRequestCustomizer()); // adds ssl info to request object

    // Establish the ServerConnector
    ServerConnector httpsConnector = new ServerConnector(server,
            new SslConnectionFactory(sslContextFactory,"http/1.1"),
            new HttpConnectionFactory(httpsConf));
    httpsConnector.setPort(httpsPort);

    server.addConnector(httpsConnector);

    // Add a Handler for requests
    server.setHandler(new HelloHandler("Hello Secure World"));

    server.start();
    server.join();
}

server.setUserRealms (new UserRealm [] {new OSMUserRealm ()});В Jetty 9.3 я не нашел альтернативного метода для UserRealm, есть предложения, как мне переписать эту строку кода?

Безопасность обрабатывается службой LoginService, а служба LoginService может содержать область (если этот LoginService поддерживает такую ​​концепцию).

LoginService может принадлежать в качестве компонента на сервере, но это только для управления жизненным циклом службы LoginService.

WebAppContext с настройкой контекста безопасностичтобы использовать определенную область, найдет все компоненты LoginService на сервере и использует ту, которая соответствует указанной области.

...