2011-10-06 4 views
3

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

+0

Что именно вам нужна эта информация? Там могут быть более эффективные способы, чем взломать в некоторых контейнерах конкретный код, который сделает ваш Webapp не переносимым. – BalusC

ответ

10

От 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> 
+1

Я понял, что ОП хотел собрать их все в какую-то «карту» или что-то в этом роде. Но это действительно один из «лучших способов», о которых я говорил в своем комментарии к вопросу :) – BalusC

+0

@BalusC: Да, я знаю, но я не хотел использовать конкретный код контейнера с отражением, и у меня нет нашел публичный API. Во всяком случае, я написал это просто для удовольствия :-) – palacsint

+0

Мне нужна эта информация, чтобы проверить, имеет ли запрашиваемый ресурс известный тип mime для сервера, я просто не знал, что req.getServletContext(). GetMimeType() делает именно это ... Я использовал: URLConnection.getFileNameMap(). getContentTypeFor(), но я хотел что-то, что было специфичным для сервера ... Будет ли предыдущее делать то, что я после? –

Смежные вопросы