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

时间:2013-03-11 19:56:14

标签: java tomcat ssl

我们有一个java Web应用程序,它使用Tomcat 7部署在许多不同的客户端中。我们的一个客户希望我们强制使用SSL,以便强制执行https。其他部署应该没有SSL,因为它们没有SSL证书。

我们知道如何通过web.xml中的安全约束标记来强制执行它,但是我们希望避免必须对单个客户端进行特殊构建的麻烦,并且宁愿能够将其设置为数据库参数,它将由应用程序读取,然后以编程方式强制执行SSL。

这可能吗?我们怎么做?

提前多多感谢。

Jonathas的


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

2 个答案:

答案 0 :(得分:3)

您可以通过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`
    }
}

答案 1 :(得分:1)

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

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

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

请参阅此also