岳娅纯 发表于 2025-6-30 07:50:02

Spring Boot 使用 Tomcat 作为容器时访问根 context-path 302分析

起因是安全团队反馈了一个漏洞,说通过公网域名访问内网中的一个SpringBoot服务的根路径,原本是域名的url变成了服务的内网的ip。
简略版的网络拓扑如下:

SpringBoot版本:2.2.5.RELEASE
server.servlet.context-path=/demo通过域名访问的url如下:
https://domain.cn/demo访问之后url转变为:
http://10.x.1/demo/因为网关后面的SpringBoot服务在多个机器部署,转变后的url会变成其中的一台服务器的ip。
在nginx机器上看了下日志,发现请求有一个302重定向的过程,然后变成了SpringBoot的404页面,因为根路径没有对应的handler处理。
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Apr 10 23:59:59 CST 2025
There was an unexpected error (type=Not Found, status=404).
No message available测试环境,在Chrome中打开F12调试模式,在Network下开启Preserve log,通过SpringBoot服务所在机器的ip和端口直接访问服务的根路径,同样有一个302重定向的过程
http://10.x.1/demo
会转变为
http://10.x.1/demo/url在302重定向后,url后面拼接了一个 /
怀疑是不是SpringBoot有什么特殊处理,SpringBoot中是通过org.springframework.web.servlet.DispatcherServlet:doDispatch方法来分发处理请求的,本地调试项目发现doDispatch方法会进入两次,DispatcherServlet上面是tomcat容器了,看样子是容器里了,往上回溯调用链发现org.apache.catalina.mapper.Mapper:internalMapWrapper方法里有一段代码有关于重定向的逻辑,代码如下:
if(mappingData.wrapper == null && noServletPath &&
      contextVersion.object.getMapperContextRootRedirectEnabled()) {
    // The path is empty, redirect to "/"
    path.append('/');
    pathEnd = path.getEnd();
    mappingData.redirectPath.setChars
      (path.getBuffer(), pathOffset, pathEnd - pathOffset);
    path.setEnd(pathEnd - 1);
    return;
}意思就是如果请求的路径是 "" ,那么将重定向到 / ,项目的 server.servlet.context-path=/demo,那么访问根路径,后面不加其它的url,正好就走到了这一个逻辑里面,看代码逻辑是有一个参数可以控制是否重定向的:mapperContextRootRedirectEnabled,这个是org.apache.catalina.core.StandardContext类中的一个配置参数,可以通过配置来修改
server.tomcat.redirect-context-root贴一下它的注释:
Determines if requests for a web application context root will be
redirected (adding a trailing slash) by the Mapper. This is more
efficient but has the side effect of confirming that the context path is
valid.修改参数的值为false,重启项目再次访问,不再出现302,而是直接到了404页面
server.tomcat.redirect-context-root=false如果项目的context-path是 / 没有302重定向的过程。
有项目使用了undertow作为容器,但是看了下undertow的代码,发现没有提供类似的参数,后面写一篇文章来记录使用undertow作为容器时出现这样情况的解决方案。
tomcat作为老牌的容器,相较undertow还是有更多灵活的配置选项。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

溧久苟 发表于 2025-11-8 06:23:44

前排留名,哈哈哈

王妍芳 发表于 2025-11-29 02:45:37

鼓励转贴优秀软件安全工具和文档!

拓炊羡 发表于 2025-12-19 03:52:38

这个好,看起来很实用

稼布欤 发表于 2025-12-23 07:27:23

前排留名,哈哈哈

上官泰 发表于 2026-1-16 10:34:26

感谢,下载保存了

恶凝毛 发表于 2026-1-17 13:38:10

感谢分享

创蟀征 发表于 2026-1-18 02:11:54

yyds。多谢分享

袁可佳 发表于 2026-1-20 08:26:07

用心讨论,共获提升!

魁睥 发表于 2026-1-22 03:22:52

很好很强大我过来先占个楼 待编辑

欤夤 发表于 2026-1-23 07:01:39

谢谢分享,试用一下

慢秤 发表于 2026-1-24 01:32:24

感谢发布原创作品,程序园因你更精彩

懵径 发表于 2026-1-26 04:15:47

yyds。多谢分享

染悄 发表于 2026-2-1 04:25:41

谢谢分享,试用一下

撒阗奕 发表于 2026-2-7 04:03:22

分享、互助 让互联网精神温暖你我

汤流婉 发表于 2026-2-9 02:19:56

懂技术并乐意极积无私分享的人越来越少。珍惜

俞秋荣 发表于 2026-2-9 12:32:28

过来提前占个楼

豌畔丛 发表于 2026-2-9 18:45:10

感谢发布原创作品,程序园因你更精彩

习和璧 发表于 2026-2-10 05:15:01

这个好,看起来很实用

羊舌正清 发表于 2026-2-11 04:15:51

感谢分享,学习下。
页: [1] 2
查看完整版本: Spring Boot 使用 Tomcat 作为容器时访问根 context-path 302分析