首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring引导、静态资源和mime类型配置

Spring引导、静态资源和mime类型配置
EN

Stack Overflow用户
提问于 2017-11-10 11:52:02
回答 3查看 13.5K关注 0票数 7

我面临着一个我无法处理的Spring启动配置问题..。我试图用Spring为HbbTV构建一个HbbTV示例,因此我需要使用mime-type="application/vnd.hbbtv.xhtml+xml“为"index.html”页面提供服务。

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

使用下面的代码,无论我多么努力地尝试,我都会得到一个text/html内容类型。

代码语言:javascript
复制
<?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>

因此,我尝试在@Controller中添加一个"home()“端点,以强制使用正确的mime类型,这是可行的。

代码语言:javascript
复制
@RestController
public class HbbTVController {

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

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

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

代码语言:javascript
复制
@Controller
public class HbbTVController {

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

好吧,它为我的index.html提供了正确的服务,但是内容类型是错误的: text/html而不是application/vnd.hbbtv.xhtml+xml。此外,我不想通过访问myserver.com/hbbtv获取index.html,而是直接访问myserver.com/index.html。

我怎么能这么做?

谢谢..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-13 11:29:28

最后,我找到了"Spring兼容的解决方案“。这和Jamie建议的一样,但是通过Spring机制实现了。

Spring 1:

代码语言:javascript
复制
@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 2:

代码语言:javascript
复制
@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);
    }
}
票数 11
EN

Stack Overflow用户

发布于 2019-08-03 21:56:21

我将扩展@Cheloute引导提供的注释,默认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的示例

代码语言:javascript
复制
@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);

    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-11-13 00:00:13

无法帮助Spring,但是如果您没有得到其他响应,请尝试以下几个:

  • 将文件类型设置为.xhtml而不是.html
  • 在Jetty服务器的.xhtml文件中提供从application/vnd.hbbtv.xhtml+xml到MIME类型的映射。关于如何做那个here的更多细节。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47222191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档