假设我的Tomcat webapps目录如下所示:
webapps/
webapps/fooapp/
webapps/fooapp/WEB-INF/
webapps/fooapp/WEB-INF/web.xml
webapps/fooapp/bardir/
当我发出/fooapp/bardir
的GET请求时,Tomcat看到webapps / fooapp / bardir是一个目录,并向302发送回/fooapp/bardir/
(末尾有一个斜杠)。
以下是我的问题: Tomcat源代码中的会发生这种情况吗?(我正在查看6.0.x但任何版本的正确答案都会是一个很好的起点。)
我可以在Catalina Functional Specifications中找到关于此主题的唯一参考资料,其中说明了默认Servlet:
在由此servlet处理的每个HTTP GET请求上,应执行以下处理:
[...]
- 如果请求的资源是目录:
- 如果请求路径未以“/”结尾,则重定向到附加了“/”的相应路径,以便正确解析欢迎文件中的相对引用。
但是,此功能似乎不在org.apache.catalina.servlets.DefaultServlet中;或者至少,它并不是唯一的:如果我用一个 servlet-class不存在的servlet替换web.xml中的默认servlet,目录路径仍然会返回302 添加斜杠,而其他每个请求都会按预期返回错误。
答案 0 :(得分:3)
我认为它发生在org.apache.tomcat.util.http.mapper.Mapper,即internalMapWrapper (Context, CharChunk, MappingData)
方法。
但不幸的是我不太确定 - 也许这真的是一个更适合tomcat-users邮件列表的问题。很抱歉没有更好的答案。
答案 1 :(得分:0)
Eclipse调试器了解到重定向发生在CoyoteAdapter
类的第504行,几乎在postParseRequest()
方法的末尾。
// Possible redirect
MessageBytes redirectPathMB = request.getMappingData().redirectPath;
if (!redirectPathMB.isNull()) {
// ...
response.sendRedirect(redirectPath); // <--- Here.
return false;
}
Tomcat 6.0.20 btw。
更新:实际上,redirectPath
确实由@Henning的答案中提到的Mapper
填充,确实在internalMapWrapper()
方法中。查看源代码here。
if(mappingData.wrapper == null && noServletPath) {
// The path is empty, redirect to "/"
mappingData.redirectPath.setChars
(path.getBuffer(), pathOffset, pathEnd);
path.setEnd(pathEnd - 1);
return;
}