我们有一个java Web应用程序,它使用Tomcat 7部署在许多不同的客户端中。我们的一个客户希望我们强制使用SSL,以便强制执行https。其他部署应该没有SSL,因为它们没有SSL证书。
我们知道如何通过web.xml中的安全约束标记来强制执行它,但是我们希望避免必须对单个客户端进行特殊构建的麻烦,并且宁愿能够将其设置为数据库参数,它将由应用程序读取,然后以编程方式强制执行SSL。
这可能吗?我们怎么做?
提前多多感谢。
Jonathas的
更新:我们需要的是,在这个特定的环境中,应用程序自动将por 80重定向到端口443,禁用端口80不是一个可行的选择。
答案 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