Spring Boot 内置Tomcat扩展
2018-01-02 11:21
543 查看
我们在用spring boot进行web开发的时候为了方便都是采用spring boot内置的web服务器进行测试,本篇文章也只针对tomcat进行讲解。
但是内置的tomcat能够配置的参数并不太多,很多额外的配置属性都需要通过编程的方式扩展内置tomcat。方便的是spring boot已经提供了对扩展的支持,我们来看看官方的内容
这是spring boot官方提供的扩展的方式,但是通过详细分析该方法能扩展的tomcat内容并不多所以我们需要更进一步的进行扩展。
我们分析spring boot官方提供的这段代码,重点是在这行
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
这表明是通过这种方式构建了tomcat容器,同时对建的这个容器进行配置一些属性,我们来看看这个类的这个方法
在这里我们就能对内置tomcat进行更多的配置,那么我们就自建一个类继承TomcatEmbeddedServletContainerFactory
这样我们就能做更多的自定义配置了,这样配置好后我们需要新建一个类来创建一个我们自定义的tomcat
这样我们就完成spring boot内置tomcat的配置
注意:当我们启动应用的时候其实启动的是2个tomcat,一个是spring boot默认的另一个是自定义配置的
但是内置的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 Boot修改内置Tomcat端口号
- Spring Boot 定制与优化内置的Tomcat容器
- Linux环境下Spring Boot项目内置Tomcat参数配置
- Spring Boot 菜鸟教程 27 内置tomcat访问https
- Spring Boot修改内置Tomcat端口号
- Spring Boot修改内置Tomcat端口号
- Spring Boot修改内置Tomcat端口号
- springBoot项目打jar包发布时启动包内置tomcat无法启动错误分析
- Spring Boot修改内置Tomcat端口号
- springboot 在idea多模块下 子模块的web项目用内置tomcat启动访问jsp报404
- 详解springboot-修改内置tomcat版本
- Spring Boot修改内置Tomcat端口号
- springBoot修改内置tomcat端口
- SpringBoot内置tomcat出现APR版本过低解决办法
- spring boot 实际应用(一) 内置tomcat 实现JMX配置
- spring-boot设置内置启动的tomcat端口
- spring boot内置tomcat设置虚拟目录
- Spring Boot修改内置Tomcat端口号
- Spring Boot 定制与优化内置的Tomcat容器实例详解
- 使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中