我们可以通过如下两种方式修改servlet容器配置:
1、在springBoot的配置文件中修改
server.port=8081
#项目访问路径
server.context-path=/crud
server.tomcat.uri-encoding=UTF-8
#通用的Servlet容器设置
server.xxx
#Tomcat的设置
server.tomcat.xxx
2、编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置。
@Bean //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
return new EmbeddedServletContainerCustomizer() {
//定制嵌入式的Servlet容器相关的规则
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8083);
}
};
}
原理
1、springBoot默认的servlet容器
springBoot默认使用tomcat作为嵌入式的servlet容器
2、定制servlet容器相关配置
1、在springBoot配置文件中修改server开头的配置。
具体可以配置哪些项,我们可以打开ServerProperties类。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties
implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {
/**
* Server HTTP port.
*/
private Integer port;
/**
* Network address to which the server should bind to.
*/
private InetAddress address;
/**
* Context path of the application.
*/
private String contextPath;
/**
* Display name of the application.
*/
private String displayName = "application";
private String servletPath = "/";
第一项就是我们熟知的port属性。里面还有一些其他的如contextPath,servletPath等。
2、编写一个EmbeddedServletContainerCustomizer
编写一个嵌入式的Servlet容器的定制器添加到容器中。
@Bean
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
return new EmbeddedServletContainerCustomizer(){
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8080);
}
};
}
重新启动springBoot项目,查看控制台,发现确实在8089端口启动了。
3、总结
上述两种方式虽然表面上看起来不同,但是实际上在底层一样的。我们可以打开ServerProperties ,可以看到它本生也是一个EmbeddedServletContainerCustomizer 。
在它的customize 方法中,也是通过ConfigurableEmbeddedServletContainer设置servlet容器配置的。
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (getPort() != null) {
container.setPort(getPort());
}
if (getAddress() != null) {
container.setAddress(getAddress());
}
if (getContextPath() != null) {
container.setContextPath(getContextPath());
}
if (getDisplayName() != null) {
container.setDisplayName(getDisplayName());
}
if (getSession().getTimeout() != null) {
container.setSessionTimeout(getSession().getTimeout());
}
//...
}