暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot嵌入式容器的运行参数配置及HTTPS

我们家Java 2021-08-24
866

点击上方蓝色我们家Java,选择“关注


在SpringBoot项目中web Server默认支持的嵌入式容器是Tomcat,还可以切换到Jetty、Undertow。可以通过修改配置文件中的配置(简单)或者自定义配置类(专业化调优)方式来调整Tomcat运行参数。

修改配置文件中的配置(简单)


常用的参数
server.port
内嵌容器启动端口号,默认为8080
server.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就是我们需要的Server Properties。


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-8


自定义配置类(专业化调优)
在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;

@Configuration
public 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");
        }
    }
}

以上这段代码核心的配置工厂是ConfigurableServletWebServerFactory,默认使用TomcatServletWebServerFactory来创建TomcatWebServer的抽象web服务的抽象工厂类。

MyTomcatConnectionCustomizer是我们编写的针对连接器配置自定义的实现类,并将其实例化。

定制的内容更多,使用更灵活。


配置HTTPS

HTTPS是HTTP协议的安全版本,HTTPS在HTTP的基础下加SSL,HTTPS 的安全基础是SSL,因此加密的详细内容就需要SSL。


生成自签名证书

以mac系统为例,输入命令行:
keytool -genkeypair -alias selfsigned_localhost_sslserver -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore JavaFamily.p12 -validity 3650

-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: PKCS12

配置完成后启动程序。


访问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: PKCS12

再改写之前创建的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;

@Configuration
public 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;
    }

}

用HTTP协议的80端口访问会自动跳转到HTTPS协议的8888端口。这时当我们访问http://localhost:80/hello时会自动跳转到https://localhost:8888/hello。

点击下方阅读原文,查看上一篇
文章转载自我们家Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论