Предположим, что мой каталог веб-приложений Tomcat похож на это:
webapps/
webapps/fooapp/
webapps/fooapp/WEB-INF/
webapps/fooapp/WEB-INF/web.xml
webapps/fooapp/bardir/
Когда я выполняю ПОЛУЧИТЬ запрос на /fooapp/bardir
, Tomcat видит, что webapps/fooapp/bardir является каталогом и передает 302 обратно /fooapp/bardir/
(с наклонной чертой в конце).
Вот мой вопрос: Где в исходном коде Tomcat это происходит? (Я смотрю на 6.0.x, но корректный ответ для любой версии был бы большой начальной точкой.)
Единственный ссылочный материал, который я могу найти на этом предмете, находится в Функциональных спецификациях Catalina, который указывает, относительно Сервлета По умолчанию:
На каждом HTTP-запросе GET, обработанном этим сервлетом, должна быть выполнена следующая обработка:
[...]
- Если требуемый ресурс является каталогом:
- Если путь запроса не заканчивается "/", перенаправление к соответствующему пути с "/" добавленный так, чтобы относительные ссылки в желанных файлах были разрешены правильно.
Однако эта функциональность, кажется, не находится в org.apache.catalina.servlets. DefaultServlet; или по крайней мере, это не там исключительно: если я заменяю сервлет по умолчанию в web.xml с сервлетом, класс сервлета которого не существует, пути к каталогам все еще возвращаются 302 для добавления наклонной черты, в то время как любой запрос возвращается с ошибкой как ожидалось.
Я думаю , что это происходит в org.apache.tomcat.util.http.mapper.Mapper , а именно в internalMapWrapper (Context, CharChunk, MappingData)
метод.
Но, к сожалению, я не совсем уверен - возможно, этот вопрос действительно лучше подходит для списка рассылки tomcat-users . Извините, что у меня нет лучшего ответа.
Отладчик Eclipse узнал, что перенаправление происходит в строке 504 класса CoyoteAdapter
, почти в конце метода postParseRequest ()
.
// Possible redirect
MessageBytes redirectPathMB = request.getMappingData().redirectPath;
if (!redirectPathMB.isNull()) {
// ...
response.sendRedirect(redirectPath); // <--- Here.
return false;
}
Tomcat 6.0.20 кстати.
Обновление : на самом деле redirectPath
действительно заполнен Mapper
, как указано в ответе @ Henning, действительно, в методе internalMapWrapper ()
. Ознакомьтесь с исходным кодом здесь .
if(mappingData.wrapper == null && noServletPath) {
// The path is empty, redirect to "/"
mappingData.redirectPath.setChars
(path.getBuffer(), pathOffset, pathEnd);
path.setEnd(pathEnd - 1);
return;
}