Где Tomcat добавляет / к путям к каталогам?

Предположим, что мой каталог веб-приложений 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 для добавления наклонной черты, в то время как любой запрос возвращается с ошибкой как ожидалось.

6
задан Anonymoose 12 May 2010 в 03:40
поделиться

2 ответа

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

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

3
ответ дан 17 December 2019 в 18:11
поделиться

Отладчик 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;
    }
0
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: