Spring引导、静态资源和mime类型配置
Spring Boot, static resources and mime type configuration
我面临 Spring 我无法处理的启动配置问题...
我正在尝试使用 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";
}
...
}
"That works" 表示码头服务器为我提供了一个 html 文件,该文件具有包含测试 someText 的正确内容类型。
我的下一次尝试是用@Controller 替换@RestController(相同的produce 配置),并替换"someText"通过 index.html
@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.
我该怎么做?
谢谢...
无法帮助 Spring 引导端,但如果您没有得到其他响应,请尝试这些:
将文件类型设置为 .xhtml
而不是 .html
。
在 Jetty 服务器的 mime.properties
file. A few more details on how to do that here.
上提供从 .xhtml
到 MIME 类型 application/vnd.hbbtv.xhtml+xml
的映射
好吧,我终于找到了 "Spring boot compliant solution"。这与 Jamie Birch 所建议的相同,但通过 Spring 机制实现。
Spring 引导 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 引导 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);
}
}
我将扩展@Cheloute 提供的评论
Sping 引导具有默认的 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);
}
}
我面临 Spring 我无法处理的启动配置问题... 我正在尝试使用 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";
}
...
}
"That works" 表示码头服务器为我提供了一个 html 文件,该文件具有包含测试 someText 的正确内容类型。
我的下一次尝试是用@Controller 替换@RestController(相同的produce 配置),并替换"someText"通过 index.html
@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.
我该怎么做?
谢谢...
无法帮助 Spring 引导端,但如果您没有得到其他响应,请尝试这些:
将文件类型设置为
.xhtml
而不是.html
。在 Jetty 服务器的
mime.properties
file. A few more details on how to do that here. 上提供从
.xhtml
到 MIME 类型 application/vnd.hbbtv.xhtml+xml
的映射
好吧,我终于找到了 "Spring boot compliant solution"。这与 Jamie Birch 所建议的相同,但通过 Spring 机制实现。
Spring 引导 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 引导 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);
}
}
我将扩展@Cheloute 提供的评论 Sping 引导具有默认的 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);
}
}