我在 Tomcat 7 中使用 SSL,创建一个密钥库并进行配置server.xml
,并按web.xml
如下方式配置
<security-constraint>
<!-- SSL enforced -->
<web-resource-collection>
<web-resource-name>SSL</web-resource-name>
<url-pattern>/inspectionGp/*</url-pattern>
<url-pattern>/inspection/*</url-pattern>
<url-pattern>/inspGpDt/*</url-pattern>
<url-pattern>/inspDt/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
这适用于 SSL,这些受限制的 URL 被强制仅使用 SSL,但其他 URL 也可以同时使用 HTTP 和 HTTPS,这很奇怪,我不想对未在 中配置的 URL 使用 HTTPS <url-pattern>
。我使用 <transport-guarantee>NONE</transport-guarantee>
,这将导致所有 URL 都支持 HTTP 和 HTPPS。所以有人能帮我解释一下我该如何解决这个问题吗?
答案1
绝对要考虑在所有事情上使用 SSL。我们的许多客户都选择这种方式,我强烈推荐。
如果您混合使用 HTTP/HTTPS 并希望保持会话状态,则必须绕过 Tomcat 中试图阻止这种情况的一些机制(JSESSIONID 的安全 cookie)。一旦您成功做到这一点,那么有人就可能从 HTTP 劫持会话并在 HTTPS 端采取行动。
尽管如此,如果您想要拥有这种级别的细粒度控制,您可以考虑使用 ServletFilter。该过滤器可以首先应用于 web.xml 中,然后应用于“/*”URL 模式(或仅应用于您需要做出此决定的模式)上的“REQUEST”调度程序。
然后,过滤器会查看请求。如果路径必须是 HTTPS,它会检查 request.isSecure()。如果不安全,它会发出 301 重定向到 HTTPS 端,确保维护完整的请求路径和任何 URL 参数。从 HTTPS 重定向到 HTTP 也一样。
我非常喜欢 servlet 过滤器。它们是处理请求的瑞士军刀。没有什么是你做不到的。最重要的是,行为是应用程序的一部分,而不是 Tomcat 设置的自定义。你可以在任何地方部署应用程序,它都会“正常工作”。