2011-10-06 9 views
3

我正在爲Apache Tomcat編寫一個過濾器,我想知道是否有一種方法可以在不顯式讀取xml文件的情況下獲取放置在/conf/web.xml文件配置文件中的mimetypes。也許有什麼可用的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

我明白,OP想把它們全部放入一些'Map'或其他東西。但這確實是我在我對這個問題的評論中談到的「更好的方法」之一:) – BalusC

+0

@BalusC:是的,我知道,但我不想使用反射的容器特定代碼,我沒有發現任何公共API。無論如何,我寫它只是爲了好玩:-) – palacsint

+0

我需要此信息以檢查請求的資源是否具有已知的MIME類型到服務器,我只是不知道req.getServletContext()。getMimeType()這只是... 我正在使用: URLConnection.getFileNameMap()。getContentTypeFor(),但我想要的是服務器特定的東西... 以前會做我以後做什麼? –

相關問題