2010-05-12 1 views
6

Пусть мой каталог Tomcat WebApps выглядит следующим образом:Где Tomcat добавляет/в пути к каталогам?

webapps/ 
webapps/fooapp/ 
webapps/fooapp/WEB-INF/ 
webapps/fooapp/WEB-INF/web.xml 
webapps/fooapp/bardir/ 

Когда я делаю запрос GET для /fooapp/bardir, Tomcat видит, что WebApps/приложение Foo/bardir является каталогом и отправляет обратно 302 в /fooapp/bardir/ (с косой чертой в конец).

вот мой вопрос: Где в Tomcat код Это правда? (Я смотрю на 6.0.x, но правильный ответ для любой версии был бы отличной отправной точкой.)

Единственный справочный материал, который я могу найти на эту тему, находится в Catalina Functional Specifications, в котором говорится о сервлете по умолчанию :

на каждый запрос HTTP GET обрабатывается сервлетом, следующая обработка должна быть выполнена:

[...]

  • Если запрошенный ресурс является каталогом:
    • Если путь запроса не заканчивается на «/», перенаправляйте на соответствующий путь с добавлением «/», чтобы относительные ссылки в файлах приветствия были правильно разрешены.

Однако, эта функциональность не представляется, в org.apache.catalina.servlets.DefaultServlet; или, по крайней мере, это не так: если я заменю сервлет по умолчанию в web.xml на сервлет, чей сервлет-класс не существует, пути каталога все еще возвращаются 302, чтобы добавить косую черту, назад с ошибкой, как ожидалось.

ответ

3

I думаю, это происходит в org.apache.tomcat.util.http.mapper.Mapper, а именно в методе internalMapWrapper (Context, CharChunk, MappingData).

Но, к сожалению, я не совсем уверен - может быть, это действительно вопрос, который лучше подходит для рассылки tomcat-users. Извините за то, что у вас нет лучшего ответа.

+0

Я думаю, вы нашли это! И комментарий «по умолчанию сервлета», похоже, показывает, что кто-то был немного смущен, когда должно произойти отображение сервлетов, точно так же, как я подозревал. Спасибо за вашу помощь. – Anonymoose

+0

+1 Я задал один и тот же вопрос по-другому: http://stackoverflow.com/questions/5578548/lift-webapp-has-directory-and-resource-with-the-same-name-but-gives-302 спасибо! – opyate

+0

PS Jeppe из группы Lift опубликовал эту связанную ошибку (пока еще нефиксированную): https://issues.apache.org/bugzilla/show_bug.cgi?id=32424 – opyate

0

Отладчик Eclipse узнал, что перенаправление происходит в строке 504 класса CoyoteAdapter, почти в конце метода postParseRequest().

// Possible redirect 
    MessageBytes redirectPathMB = request.getMappingData().redirectPath; 
    if (!redirectPathMB.isNull()) { 
     // ... 
     response.sendRedirect(redirectPath); // <--- Here. 
     return false; 
    } 

Tomcat 6.0.20 btw.

Update: на самом деле, то redirectPath действительно заполнена 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; 
    }