Где Tomcat добавляет / к путям каталогов? - PullRequest
6 голосов
/ 12 мая 2010

Предположим, мой каталог веб-приложений Tomcat выглядит следующим образом:

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

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

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

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

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

[...]

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

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

Ответы [ 2 ]

3 голосов
/ 13 мая 2010

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

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

0 голосов
/ 13 мая 2010

Отладчик 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;
    }
...