3

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

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

这可能吗?我们如何做到这一点?

提前非常感谢。

乔纳萨斯


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

4

2 回答 2

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`
    }
}
于 2013-03-11T21:08:01.603 回答
1

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

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

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

另请参阅

于 2013-03-11T19:58:57.710 回答