SpringBoot嵌入式容器的运行参数配置及HTTPS
在SpringBoot项目中webServer默认支持的嵌入式容器是Tomcat,还可以切换到Jetty、Undertow。可以通过修改配置文件中的配置(简单)或者自定义配置类(专业化调优)方式来调整Tomcat运行参数。修改配置文件中的配置(简单)常用的参数server.port内嵌容器启动端口号,默认为8080server.servlet.context-path配置项目的访问路径server.tomcat.uri-encoding用于解码URI的字符编码server.error.path配置当前项目出错时跳转去的页面server.servlet.session.timeout配置session失效时间,默认30分钟server.tomcat.basedir配置Tomcat运行日志和临时文件的目录。若不配置则默认使用系统的临时目录。我们可以参考一下官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.server其中编号11就是我们需要的ServerProperties。tomcat性能优化及常用核心参数请求到达tomcat时首先经过连接器,在请求被接收之前会维护一个接收队列,这个队列的最大长度就是server.tomcat.max-connections,默认接受的最大请求连接数为8192,监听连接请求并生成一个Socket任务提交到线程池去处理。这时Executor中的线程全都被占用,server.tomcat.accept-count可以设置等待队列的大小,默认值为100。server.tomcat.threads.max为最大的工作线程池数量,不是越大越好,默认值为200。server.tomcat.threads.min-spare是在应用空闲的时候保留最小的工作线程池数量,避免临时创建线程浪费时间,默认值为10。配置文件的编写我们已经做过很多了,.yml文件的格式大致如下:server: port: 8080 tomcat: uri-encoding: UTF-81234复制代码类型:[java]自定义配置类(专业化调优)在config文件夹下创建TomcatCustomizerConfig.java文件:package com.javafamily.familydemo.config;import org.apache.catalina.connector.Connector;import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class TomcatCustomizerConfig { @Bean // 添加定制器 public ConfigurableServletWebServerFactory configurableServletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers(new MyTomcatConnectionCustomizer()); return factory; } static class MyTomcatConnectionCustomizer implements TomcatConnectorCustomizer { public MyTomcatConnectionCustomizer() { } @Override public void customize(Connector connector) { connector.setPort(Integer.parseInt("8080")); connector.setProperty("maxConnections", "8192"); } }}1234567891011121314151617181920212223242526272829303132复制代码类型:[java]以上这段代码核心的配置工厂是ConfigurableServletWebServerFactory,默认使用TomcatServletWebServerFactory来创建TomcatWebServer的抽象web服务的抽象工厂类。MyTomcatConnectionCustomizer是我们编写的针对连接器配置自定义的实现类,并将其实例化。可定制的内容更多,使用更灵活。配置HTTPSHTTPS是HTTP协议的安全版本,HTTPS在HTTP的基础下加入SSL,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。生成自签名证书以mac系统为例,输入命令行:keytool -genkeypair -alias selfsigned_localhost_sslserver -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore JavaFamily.p12 -validity 36501复制代码类型:[java]-genkeypair创建一个新的密钥-aliaskeystore的别名-keyalg表示使用的加密算法是RSA-keysize密钥长度-keystore密钥存放位置-validity密钥有效时长创建好JavaFamily.p12后,将其拖进src/main/resources/config下。配置application.yml文件:server: port: 8888 ssl: key-store: classpath:config/JavaFamily.p12 key-store-password: 123456 key-store-type: PKCS12123456复制代码类型:[java]配置完成后启动程序。访问http://localhost:8888/hello:再访问https://localhost:8888/hello:首次访问会被警告不安全,在当前页面用键盘输入thisisunsafe,不是在地址栏输入,就直接敲键盘就行了,页面即会自动刷新进入网页。HTTP请求重定向为HTTPS当我们进行了一系列的配置之后,HTTPS可以进行正常访问,但是HTTP却出现了报错。这样对于访问HTTP的用户是很不友好的,所以我们要将HTTP请求重定向到HTTPS。这就需要用编码的方式来配置Tomcat。首先在application.yml中添加一个端口:server: port: 8888 httpPort: 80 ssl: key-store: classpath:config/JavaFamily.p12 key-store-password: 123456 key-store-type: PKCS121234567复制代码类型:[java]再改写之前创建的TomcatCustomizerConfig.java文件:package com.javafamily.familydemo.config;import org.apache.catalina.Context;import org.apache.catalina.connector.Connector;import org.apache.tomcat.util.descriptor.web.SecurityCollection;import org.apache.tomcat.util.descriptor.web.SecurityConstraint;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class TomcatCustomizerConfig { @Value("${server.httpPort}") int httpPort; @Value("${server.port}") int httpsPort; @Bean public ConfigurableServletWebServerFactory configurableServletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint constraint = new SecurityConstraint(); constraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); constraint.addCollection(collection); context.addConstraint(constraint); } }; factory.addAdditionalTomcatConnectors(connector()); return factory; } public Connector connector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); // 监听http端口号 connector.setPort(httpPort); // 不安全 connector.setSecure(false); // 监听到http的端口号后转向到的https的端口号 connector.setRedirectPort(httpsPort); return connector; }}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152复制代码类型:[java]用HTTP协议的80端口访问会自动跳转到HTTPS协议的8888端口。这时当我们访问http://localhost:80/hello时会自动跳转到https://localhost:8888/hello。