我有一个带有嵌入式 tomcat 版本 6.0.37 的 java Web 应用程序,我使用的是 http 和 https。我有一个配置页面,其中有选项:
- SSL 启用
- SSL 重定向
- SSL 端口
- HTTP 端口
- 重新开始
默认情况下启用 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 重定向在我重新启动我的应用程序后工作。我已经搜索了很多,但我无法解决这个问题。将不胜感激任何帮助。