Apache Tomcat MimeTypes - 任何获取它们的方法?

Mik*_* S. 3 tomcat java-ee servlet-filters mime-types

我正在为Apache Tomcat编写一个过滤器,我想知道是否有办法获取放置在/conf/web.xml文件配置文件中的mimetypes而不显式读取xml文件.Apache Tomcat库中是否有可用的东西?

pal*_*int 11

来自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.                                                        -->
Run Code Online (Sandbox Code Playgroud)

所以它们可以通过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");
    ...
}
Run Code Online (Sandbox Code Playgroud)

我还没有找到任何其他公共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);
}
Run Code Online (Sandbox Code Playgroud)

它适用于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>
Run Code Online (Sandbox Code Playgroud)