Tomcat在哪里附加/到目录路径?

时间:2010-05-12 03:40:31

标签: java tomcat servlets tomcat6

假设我的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 添加斜杠,而其他每个请求都会按预期返回错误。

2 个答案:

答案 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;
    }