1

我有一个带有嵌入式 tomcat 版本 6.0.37 的 java Web 应用程序,我使用的是 http 和 https。我有一个配置页面,其中有选项:

  1. SSL 启用
  2. SSL 重定向
  3. SSL 端口
  4. HTTP 端口
  5. 重新开始

默认情况下启用 SSL。我想将每个 http 请求重定向到 https。因此,在配置页面上,我检查 SSL 重定向选项,检查重新启动选项并提交我的表单。在服务器端,我正在执行以下操作:

if( webServerProperties.getSslRedirect() ) {

            boolean constraintExists = false;

            for( SecurityConstraint constraint : uiContext.findConstraints() ) {
                if( constraint.getDisplayName().equals(SSL_REDIRECT_CONSTRAINT_NAME) ) {
                    constraintExists = true;
                    break;
                }
            }

            if( !constraintExists ) {

                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setDisplayName(SSL_REDIRECT_CONSTRAINT_NAME);
                constraint.setAuthConstraint(false);

                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");

                constraint.setUserConstraint("CONFIDENTIAL");
                constraint.addCollection(collection);

                uiContext.addConstraint(constraint);
            }

        }
        else {

            for( SecurityConstraint constraint : uiContext.findConstraints() ) {
                if( constraint.getDisplayName().equals(SSL_REDIRECT_CONSTRAINT_NAME) ) {
                    uiContext.removeConstraint(constraint);
                }
            }

        }
uiContainer.removeConnector(uiHTTPConnector);
uiHTTPConnector.pause();
uiHTTPConnector.destroy();
uiHTTPConnector = null;

uiHTTPConnector = createHTTPConnector(
    newPort,
    webServerProperties.getSslRedirect() ? webServerProperties.getSslPort() : -1,
    newMaxThreads
    );
uiContainer.addConnector(uiHTTPConnector);
uiHTTPConnector.start();

protected Connector createHTTPConnector(int port, int sslRedirectPort, int maxThreads) throws Exception {

        Connector connector = new LifecycleEventConnector();
        org.apache.tomcat.util.IntrospectionUtils.setProperty(connector, "port", "" + port);

        connector.setAttribute("maxThreads", maxThreads);
        connector.setAttribute("keepAliveTimeout", MAX_IDLE_TIME);
        connector.setAttribute("connectionTimeout", MAX_IDLE_TIME);
        connector.setMaxParameterCount(-1);

        if( sslRedirectPort > 0 ) {
            org.apache.tomcat.util.IntrospectionUtils.setProperty(connector, "redirectPort", "" + sslRedirectPort);
        }

        return connector;
    }

private static final class LifecycleEventConnector extends Connector {

        public LifecycleEventConnector() throws Exception {
            super();
        }

        @Override
        public void initialize() throws LifecycleException {
            lifecycle.fireLifecycleEvent(INIT_EVENT, null);
            super.initialize();
        }

    }

我只想重新启动连接器,而不是重新启动整个容器并让我的整个应用程序停机。更改其他选项(HTTP 端口、SSL 端口、启用 SSL),连接器重新启动并且工作正常,但启用 SSL 重定向不起作用。SSL 重定向在我重新启动我的应用程序后工作。我已经搜索了很多,但我无法解决这个问题。将不胜感激任何帮助。

4

0 回答 0