Spring Boot 内置Tomcat扩展

21 篇文章 0 订阅
17 篇文章 1 订阅

我们在用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默认的另一个是自定义配置的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值