如何在GlassFish中为自动传送的文件设置Content-Type?

时间:2017-11-30 15:55:15

标签: servlets glassfish mime-types

将.war文件部署到GlassFish Server(当前为4.1)时,GF服务器会自动从WEB-INF/文件夹中传送文件。 (除非我通过指定Servlet覆盖它们的地址,即。)

实际上,在将.war文件部署到GF服务器时,它会将WEB-INF/下的文件提取到{gf-home}/glassfish/domains/domain1/applications/{app-name}。 然后在访问http://{hostname}:8080/{app-name}/{path}时传递它们。

现在,当访问.json文件时,服务器不会发送HTTP Content-Type: application/json标头。 这导致页面无法正确加载,FireFox控制台显示XML Parsing Error: not well-formed异常,即使文件内容完全相同。 所以我猜测它是缺少的Content-Type标签。

如何为应用/项目本身更改此mime-mapping?

从我目前看到的页面中,可以在{gf-home}/glassfish/domains/domain1/default-web.xml文件中重新定义此行为,定义mime-mapping。但假设我无法访问该文件,只能上传.war文件。 有没有解决方案?是否可以将default-web.xml打包到.war文件中?

我现在能想到的另一个解决方案是使用servlet覆盖特定的.json文件地址,并在Java中添加Content-Type标头。但我不确定是否有一种在运行时访问和读取.json文件的万无一失的方法,但是没有将它们移动到Java源代码中的任何地方,而是将它们留在WEB-INF /文件夹中? 有任何建议吗?

1 个答案:

答案 0 :(得分:6)

  

如何为应用/项目本身更改此mime-mapping?

通过在webapp自己的<mime-mapping>中声明/WEB-INF/web.xml个条目。

从Servlet 3.0版开始,web.xml文件成为可选项。这或许可以解释为什么你找不到任何人。您可以在webapp中提供自己的。 GlassFish 4.1是一个支持Servlet 3.1的容器,所以下面的Servlet 3.1兼容web.xml应该可以帮到你开始:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

    <!-- Config here. -->
</web-app>

在您的具体情况下,您需要下面的mime映射:

    <mime-mapping>
        <extension>json</extension>
        <mime-type>application/json</mime-type>
    </mime-mapping>

另见: