您的位置:首页 > 运维架构 > Tomcat

Spring Boot 内置Tomcat扩展

2018-01-02 11:21 543 查看
我们在用spring boot进行web开发的时候为了方便都是采用spring boot内置的web服务器进行测试,本篇文章也只针对tomcat进行讲解。

但是内置的tomcat能够配置的参数并不太多,很多额外的配置属性都需要通过编程的方式扩展内置tomcat。方便的是spring boot已经提供了对扩展的支持,我们来看看官方的内容

Customizing ConfigurableEmbeddedServletContainer directly

If the above customization techniques are too limited, you can register the TomcatEmbeddedServletContainerFactory, JettyEmbeddedServletContainerFactory or UndertowEmbeddedServletContainerFactory bean yourself.

@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
return factory;
}
Setters are provided for many configuration options. Several protected method ‘hooks’ are also provided should you need to do something more exotic. See the source code documentation for details.


这是spring boot官方提供的扩展的方式,但是通过详细分析该方法能扩展的tomcat内容并不多所以我们需要更进一步的进行扩展。

我们分析spring boot官方提供的这段代码,重点是在这行

TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

这表明是通过这种方式构建了tomcat容器,同时对建的这个容器进行配置一些属性,我们来看看这个类的这个方法

public EmbeddedServletContainer getEmbeddedServletContainer(
ServletContextInitializer... initializers) {
Tomcat tomcat = new Tomcat();
File baseDir = (this.baseDirectory != null ? this.baseDirectory
: createTempDir("tomcat"));
tomcat.setBaseDir(baseDir.getAbsolutePath());
Connector connector = new Connector(this.protocol);
tomcat.getService().addConnector(connector);
customizeConnector(connector);
tomcat.setConnector(connector);
tomcat.getHost().setAutoDeploy(false);
configureEngine(tomcat.getEngine());
for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector);
}
prepareContext(tomcat.getHost(), initializers);
return getTomcatEmbeddedServletContainer(tomcat);
}


在这里我们就能对内置tomcat进行更多的配置,那么我们就自建一个类继承TomcatEmbeddedServletContainerFactory

public class Myp2cTomcatEmbeddedServletContainerFactory extends TomcatEmbeddedServletContainerFactory {

@Override
public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers) {
Tomcat tomcat = new Tomcat();
File baseDir = (createTempDir("tomcat"));
tomcat.setBaseDir(baseDir.getAbsolutePath());
tomcat.setHostname("sso.myp2c.me");
StandardHost host=(StandardHost)tomcat.getHost();
if(host!=null){
host.addAlias("sso1.myp2c.me");
host.addAlias("sso2.myp2c.me");
tomcat.setHost(host);
}
tomcat.getHost().setAutoDeploy(false);
tomcat.getEngine().setBackgroundProcessorDelay(-1);
for (Connector additionalConnector : super.getAdditionalTomcatConnectors()) {
tomcat.getService().addConnector(additionalConnector);
}
prepareContext(tomcat.getHost(), initializers);
return getTomcatEmbeddedServletContainer(tomcat);
}

}


这样我们就能做更多的自定义配置了,这样配置好后我们需要新建一个类来创建一个我们自定义的tomcat

package com.hw.myp2c;

import com.hw.myp2c.config.tomcat.Myp2cTomcatEmbeddedServletContainerFactory;
import org.apache.catalina.connector.Connector;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.nio.charset.Charset;

@Configuration
public class TomcatInitializer {

@Bean
public EmbeddedServletContainerFactory servletContainer() {
Myp2cTomcatEmbeddedServletContainerFactory tomcat = new Myp2cTomcatEmbeddedServletContainerFactory();
tomcat.setUriEncoding(Charset.forName("UTF-8"));
tomcat.addAdditionalTomcatConnectors(createNioConnector());
return tomcat;
}
//该方法必须添加不然无法启动自定义的tomcat
private Connector createNioConnector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(80);//自定义的端口
return connector;
}
}


这样我们就完成spring boot内置tomcat的配置

注意:当我们启动应用的时候其实启动的是2个tomcat,一个是spring boot默认的另一个是自定义配置的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring tomcat