2017-02-15 3 views
4

Récemment, j'ai été en train de creuser dans un problème qui m'a conduit à l'élément "mime-mapping" défini dans le web-common_X_X.xsd et utilisé dans un web applications web.xml fichier. Mon but ici est de configurer Tomcat pour inclure un en-tête Content-Type spécifique lors du renvoi d'une réponse à une servlet spécifique.Tomcat 8.0 - mime-mapping & content-type

J'ai trouvé previous stack overflow posts en mentionnant la fonctionnalité, mais je suis incapable d'obtenir un exemple trivial pour travailler avec Tomcat 8.0.33.

Pour ce test, je l'ai créé le servlet suivant:

public class SimpleServlet extends HttpServlet { 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     IOUtils.write("Hello There!", resp.getOutputStream()); 
     resp.setStatus(202); 
    } 
} 

et ont les web.xml suivants:

<web-app 
     version="3.0" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

    <servlet> 
    <servlet-name>SimpleServlet</servlet-name> 
    <servlet-class>com.jamf.swa.SimpleServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>SimpleServlet</servlet-name> 
    <url-pattern>*.swa</url-pattern> 
    </servlet-mapping> 

    <mime-mapping> 
    <extension>swa</extension> 
    <mime-type>text/rtf;charset=UTF-8</mime-type> 
    </mime-mapping> 

</web-app> 

J'ai essayé ce test avec et sans le charset inclus dans l'élément "mime-type". Le type "text/rtf" est également arbitraire. J'ai testé les autres.

Une fois que l'application est lancée, je fais la demande suivante à /testing.swa:

curl --trace-ascii - http://localhost:8080/testing.swa 
== Info: Trying ::1... 
== Info: TCP_NODELAY set 
== Info: Connected to localhost (::1) port 8080 (#0) 
=> Send header, 89 bytes (0x59) 
0000: GET /testing.swa HTTP/1.1 
001b: Host: localhost:8080 
0031: User-Agent: curl/7.51.0 
004a: Accept: */* 
0057: 
<= Recv header, 23 bytes (0x17) 
0000: HTTP/1.1 202 Accepted 
<= Recv header, 27 bytes (0x1b) 
0000: Server: Apache-Coyote/1.1 
<= Recv header, 20 bytes (0x14) 
0000: Content-Length: 12 
<= Recv header, 37 bytes (0x25) 
0000: Date: Wed, 15 Feb 2017 22:37:17 GMT 
<= Recv header, 2 bytes (0x2) 
0000: 
<= Recv data, 12 bytes (0xc) 
0000: Hello There! 
Hello There!== Info: Curl_http_done: called premature == 0 
== Info: Connection #0 to host localhost left intact 

Comme vous pouvez le voir, sans en-tête Content-Type inclus.

Je peux confirmer que StandardContext:addMimeMapping() est correctement appelé avec mon mappage, mais je ne vois jamais la variable locale mimeMappings lue pendant ma requête.

Je ne trouve pas non plus de documentation sur le côté de Tomcat pour utiliser cet élément avec v8 +.

Est-ce qu'il me manque quelque chose de trivial? Tomcat a-t-il abandonné le support de cette fonctionnalité? Toute aide que vous pourriez fournir serait appréciée.

Répondre

2

Pour la liste de diffusion Tomcat, la fonctionnalité "mime-mapping" est uniquement utilisée par DefaultServlet de Tomcat. D'autres servlets peuvent utiliser ce mécanisme, mais il doit être explicitement intégré.

La fonctionnalité que je décris serait accomplie par un filtre et je pense que c'est la voie que je vais prendre.