Java 有没有一种方法可以在Tomcat中以编程方式将SSL设置为必需的(例如,不通过web.xml)?

Java 有没有一种方法可以在Tomcat中以编程方式将SSL设置为必需的(例如,不通过web.xml)?,java,tomcat,ssl,Java,Tomcat,Ssl,我们有一个java web应用程序,它使用Tomcat7部署在许多不同的客户机中。我们的一个客户希望我们强制使用SSL,以便强制使用https。其他部署应该保持没有SSL,因为它们没有SSL证书 我们知道如何通过web.xml中的安全约束标记来实施它,但我们希望避免为单个客户机进行特殊构建的麻烦,并且更希望能够将其设置为数据库参数,由应用程序读取,然后以编程方式实施SSL或不实施SSL 这可能吗?我们怎么做 先谢谢你 乔纳森 更新:我们需要的是,在此特定环境中,应用程序会自动将por 80重定

我们有一个java web应用程序,它使用Tomcat7部署在许多不同的客户机中。我们的一个客户希望我们强制使用SSL,以便强制使用https。其他部署应该保持没有SSL,因为它们没有SSL证书

我们知道如何通过web.xml中的安全约束标记来实施它,但我们希望避免为单个客户机进行特殊构建的麻烦,并且更希望能够将其设置为数据库参数,由应用程序读取,然后以编程方式实施SSL或不实施SSL

这可能吗?我们怎么做

先谢谢你

乔纳森



更新:我们需要的是,在此特定环境中,应用程序会自动将por 80重定向到端口443,禁用端口80是不可行的选择。

如果这只是针对一个客户端,只需在server.xml中注释掉普通http连接器(以及相应的端口),并只保留安全连接器和端口。
简单的解决方案,不会影响您的代码或其他部署,您的客户机可以得到他想要的

更新:
您可以重定向到https。尝试:

 <Connector port="80" protocol="HTTP/1.1"
               redirectPort="443"/>  


参见此

您可以定义一个过滤器,通过
ServletRequest.isSecure
验证连接是否安全。如果不安全,并且上下文中的应用程序需要安全连接,则重定向到“https”端点。否则,请继续

伪代码:

public class SecureConnectionFilter implements Filter {
    private boolean requireSecure;

    @Override
    public void destroy() {
        return;
    }

    @Override
    public void doFilter(final ServletRequest request,
            final ServletResponse response, final FilterChain filterChain)
            throws IOException, ServletException {
        if(requireSecure && ! (request.isSecure())) {
            // Redirect to secure endpoint
        } else {
            filterChain.doFilter(request,  response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // Determine wether the application in context is required
        // to be secure or not. If this information is not available
        // at startup time then defer this logic to `doFilter`
    }
}

谢谢你的建议。恐怕这会使端口80不可用,但我们需要通过重定向强制端口443。基于此,我对问题添加了一个更新。构建一个通用的
web.xml
模板,然后根据客户机的配置构建每个特定的实现,难道不是很容易吗?我认为这是最简单的方法。