Spring Boot,静态资源和mime类型配置

时间:2017-11-10 11:52:02

标签: spring spring-mvc spring-boot hbbtv

我正面临一个我无法处理的Spring Boot配置问题...... 我正在尝试使用Spring Boot为HbbTV构建一个HelloWorld示例,因此我需要使用mime-type =“application / vnd.hbbtv.xhtml + xml”来提供我的“index.html”页面

我的index.html将作为静态页面访问,例如http://myserver.com/index.html?param=value

使用以下代码,无论我怎么努力,我都会获得text / html内容类型。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//HbbTV//1.1.1//EN" "http://www.hbbtv.org/dtd/HbbTV-1.1.1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>MyApp HBBTV</title>
    <meta http-equiv="content-type" content="Content-Type: application/vnd.hbbtv.xhtml+xml; charset=UTF-8" />
</head>
<body>
...
</body>
</html>

所以我尝试将一个“home()”端点添加到@Controller中以强制使用正确的mime类型,这样可行。

@RestController
public class HbbTVController {

    @RequestMapping(value = "/hbbtv", produces = "application/vnd.hbbtv.xhtml+xml")
    String home() {
        return "someText";
    }
...
}

“有效”意味着jetty服务器为我提供了一个包含测试someText的正确内容类型的html文件。

我的下一次尝试是用@Controller替换@RestController(同样 生成 配置),并用 index.html替换“someText”

@Controller
public class HbbTVController {

    @RequestMapping(value = "/hbbtv", produces = "application/vnd.hbbtv.xhtml+xml")
    String home() {
        return "index.html";
    }
...
}

好吧,它正确地为我的index.html服务,但是Content-Type是错误的:text / html而不是application / vnd.hbbtv.xhtml + xml。 此外,我不想访问myserver.com/hbbtv获取index.html,而是直接访问myserver.com/index.html。

我怎么能这样做?

...谢谢

3 个答案:

答案 0 :(得分:3)

好吧,最后,我找到了#34; Spring boot兼容的解决方案&#34;。它和Jamie Birch建议的相同,但是用Spring机制实现了。

Spring Boot 1:

@Configuration
public class HbbtvMimeMapping implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
        mappings.add("html", "application/vnd.hbbtv.xhtml+xml; charset=utf-8");
        mappings.add("xhtml", "application/vnd.hbbtv.xhtml+xml; charset=utf-8");
        container.setMimeMappings(mappings);
    }

}

Spring Boot 2:

@Configuration
public class HbbtvMimeMapping implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
    @Override
    public void customize(ConfigurableServletWebServerFactory factory) {
        MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
        mappings.add("html", "application/vnd.hbbtv.xhtml+xml; charset=utf-8");
        mappings.add("xhtml", "application/vnd.hbbtv.xhtml+xml; charset=utf-8");
        factory.setMimeMappings(mappings);
    }
}

答案 1 :(得分:1)

无法帮助Spring Boot方面,但如果没有其他响应,请尝试以下方法:

  • 将文件类型设置为.xhtml而不是.html

  • 在Jetty服务器的mime.properties文件上提供从.xhtml到MIME类型application/vnd.hbbtv.xhtml+xml的映射。关于如何执行此操作的更多详细信息here

答案 2 :(得分:0)

我将扩展@Cheloute提供的评论 Sping Boot具有默认的MIME类型 https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/server/MimeMappings.java

要覆盖已设置的mime类型,请先将其删除

这是我用来替代js和css的示例

@Configuration
public class CustomServletConfiguration implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
    @Override
    public void customize(ConfigurableServletWebServerFactory factory) {
        MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
        mappings.remove("js");
        mappings.add("js", "application/javascript;charset=utf-8");
        mappings.remove("css");
        mappings.add("css", "text/css;charset=utf-8");
        factory.setMimeMappings(mappings);
        factory.setPort(9000);

    }
}