Tomcat9配置指定WAR应用强制HTTPS 其余兼容HTTP/HTTPS
配置失效原因
之前的配置无法生效核心有三点:
url-pattern匹配规则不符合预期:/frontApp仅能精准匹配路径为/frontApp的请求,无法覆盖/frontApp/index.do这类子路径资源- 非强制HTTPS路径缺少显式传输规则声明:仅配置
web-resource-collection不添加user-data-constraint无法覆盖跳转规则,必须显式指定transport-guarantee为NONE才会放行HTTP请求 - 未利用Tomcat安全约束的匹配优先级:Tomcat对安全约束遵循最具体路径优先的匹配逻辑,精度更高的路径规则会覆盖宽泛路径的规则,反向不成立。
正确配置步骤
1. 核对连接器基础配置
打开Tomcat安装目录下的conf/server.xml,确认HTTP连接器的redirectPort属性与HTTPS连接器的监听端口一致,参考配置如下:
<!-- HTTP连接器,默认监听80端口 --> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" /> <!-- 取值需和下方HTTPS连接器的port属性一致 --> <!-- HTTPS连接器,默认监听443端口 --> <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="你的证书存储路径" type="RSA" /> </SSLHostConfig> </Connector>
此前已经配置过全量HTTPS跳转的话,这一步通常不需要修改,核对参数即可。
2. 添加安全约束规则
打开Tomcat全局配置文件conf/web.xml(如果需要规则仅对单个应用生效,可修改对应应用内WEB-INF/web.xml),在<web-app>标签末尾(所有Servlet、Filter配置之后,</web-app>闭合标签之前)添加如下规则:
<!-- frontApp 强制HTTPS访问 --> <security-constraint> <web-resource-collection> <web-resource-name>FrontApp SSL Required</web-resource-name> <url-pattern>/frontApp/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> <!-- backOne 允许HTTP/HTTPS双协议访问 --> <security-constraint> <web-resource-collection> <web-resource-name>BackOne No SSL Redirect</web-resource-name> <url-pattern>/backOne/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <!-- backTwo 允许HTTP/HTTPS双协议访问 --> <security-constraint> <web-resource-collection> <web-resource-name>BackTwo No SSL Redirect</web-resource-name> <url-pattern>/backTwo/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint>
如果需要除backOne、backTwo之外的所有路径都强制跳转HTTPS,可以额外在上述规则之后添加全局规则,因为路径匹配精度差异,两个back应用的规则优先级更高,不会被全局规则覆盖:
<!-- 可选:全局路径强制HTTPS --> <security-constraint> <web-resource-collection> <web-resource-name>Global SSL Required</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
注意:如果是在单个应用的
WEB-INF/web.xml中配置规则,url-pattern是相对于当前应用上下文路径的,例如在frontApp自己的web.xml中配置强制HTTPS,url-pattern直接写/*即可,不需要写/frontApp/*。
3. 重启服务验证
保存配置后重启Tomcat即可生效,验证规则:
- 访问
http://example.com/frontApp/*下任意资源会自动重定向到HTTPS地址 - 访问
http://example.com/backOne/*、http://example.com/backTwo/*下的资源会正常通过HTTP响应,不会触发跳转,同时HTTPS访问这两个应用也可正常响应
常见注意事项
transport-guarantee共有三个可选值:NONE代表不要求加密传输,HTTP/HTTPS均可访问;CONFIDENTIAL和INTEGRAL在Tomcat中效果一致,均要求必须使用HTTPS访问,HTTP请求会触发重定向- 配置完成后测试前请清空浏览器缓存,此前配置全量跳转时返回的301永久重定向会被浏览器缓存,容易造成规则不生效的假象
- 不要保留之前配置中仅写
web-resource-collection、不添加user-data-constraint的无效规则,这类规则不会产生任何约束效果
内容的提问来源于stack exchange,提问作者nu_popli
相关产品推荐
相关产品推荐

