Apache Tomcat MimeTypes - любой способ получить их? - PullRequest
3 голосов
/ 06 октября 2011

Я пишу фильтр для Apache Tomcat, мне было интересно, есть ли способ извлечь mimetypes, помещенные в файл конфигурации файла /conf/web.xml, без явного чтения файла xml. Возможно, есть что-нибудь доступное в библиотеках Apache Tomcat?

1 Ответ

11 голосов
/ 06 октября 2011

Из tomcat/conf/web.xml:

<!-- ======================== Introduction ============================== -->
<!-- This document defines default values for *all* web applications      -->
<!-- loaded into this instance of Tomcat.  As each application is         -->
<!-- deployed, this file is processed, followed by the                    -->
<!-- "/WEB-INF/web.xml" deployment descriptor from your own               -->
<!-- applications.                                                        -->

Таким образом, они доступны через ServletContext.getMimeType метод:

@Override
protected void doGet(final HttpServletRequest req, 
        final HttpServletResponse resp) throws ServletException, IOException {
    final ServletContext servletContext = req.getServletContext();
    final String mimeType = servletContext.getMimeType("filename.txt");
    ...
}

Я не нашел другого публичного API для получения полного отображения типов MIME. Если вам действительно нужно это вы можете получить полный список расширений с этим уродливым хаком:

import java.util.Arrays;
import java.lang.reflect.Field;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.RequestFacade;
import org.apache.catalina.core.StandardContext;

...

// ugly reflection hack - do NOT use
final RequestFacade tomcatRequestFacade = (RequestFacade) req;
final Class<? extends RequestFacade> requestFacadeClass = 
    tomcatRequestFacade.getClass();
try {
    final Field field = requestFacadeClass.getDeclaredField("request");
    field.setAccessible(true);
    final Request tomcatRequest = (Request) field.get(tomcatRequestFacade);
    final StandardContext standardContext = 
        (StandardContext) tomcatRequest.getContext();
    final String[] mappings = standardContext.findMimeMappings();
    logger.info("mapping list: {}", Arrays.asList(mappings));
} catch (final Exception e) {
    logger.error("", e);
}

Работает на Tomcat 7.0.21. Поскольку он использует внутренние классы Tomcat, нет гарантии, что он будет работать с другими версиями Tomcat.

Обратите внимание, что вам все еще нужно вызвать ServletContext.getMimeType, чтобы получить типы MIME.

Требуемая зависимость maven:

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-catalina</artifactId>
    <version>7.0.21</version>
    <scope>provided</scope>
</dependency>
...