SpringBoot Web容器配置之Tomcat

  • 常规配置

spring-boot-stater-web依赖默认会使用Tomcat作为Web容器。

对Tomcat进一步配置可以在application.properties中进行。

server.port=8081
server.error.path=/error
server.servlet.session.timeout=30m
server.servlet.context-path=/springboot_demo
server.tomcat.uri-encoding=UTF-8
server.tomcat.max-threads=500
server.tomcat.basedir=/home/sang/tmp

其中:

  1. server.port 配置了 Web 容器的端口号。
  2. error.path 配置了当项目出错时跳转去的页面。
  3. session.timeout 配置了 session 失效时间,30m表示30分钟,如果不写单位而,默认单位是秒。(由于 Tomcat 中配置session 过期时间以分钟为单位,因此这里单位如果是秒的话,该时间会被转换为一个不超过所配置秒数的最大分钟数)。
  4. context-path 表示项目名称,不配置时默认为/,如果配置了,就要在访问路径中加上配置的路径。
  5. uri-encoding 表示配置 Tomcat 请求编码。
  6. max-threads 表示 Tomcat 最大线程数。
  7. basedir 是一个存放 Tomcat 运行日志和临时文件的目录,若不配置则默认使用系统的临时目录。

更多配置参考官方文档。

  • HTTPS配置

jdk中提供了一个 Java 数字证书管理工具 keytool ,在 \jdk\bin 目录下,通过这个工具可以自己生成一个数字证书,生成命令如下:

keytool -genkey -alias tomcat https -keyalg RSA -keysize 2048 -keystore sbaby.p12 -validity 365

其中:

  • -genkey 表示要创建一个新的秘钥。
  • -alias 表示 keystore 的别名
  • -keyalg 表示使用的加密算法是RSA,一种非对称加密算法。
  • -keysize 表示秘钥的长度。
  • -keystore 表示生成的密钥存放位置。
  • -validity 表示密钥的有效时间,单位为天。

在执行的过程中需要输入密钥口令等信息,根据提示输入即可。命令执行完成后,会在当前用户目录下生成一个名为 sbaby.p12 的文件,将这个文件复制到项目的根目录下,然后在 application.properties 中做如下配置:

server.ssl.key-store=sbaby.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=创建证书时设置的口令

其中:

  • key-store 表示密钥文件名。
  • key-alias 表示密钥别名。
  • key-store-password 就是在 cmd 命令执行过程中输入的密码。

配置成功后启动项目,使用 https 访问接口来查看结果。(证书是自己生成的,不被浏览器认可,此时添加信任或者继续前进即可)。如图:

此时以 HTTP 的方式访问接口就会访问失败,如图:

因为 Spring Boot 不支持同时在配置中启动 HTTP 和 HTTPS。这个时候可以配置请求重定向,将 HTTP 请求重定向为 HTTPS 请求。如下:

/**
 * @Author Sbaby
 * @Date 2019/11/22 21:50
 * @Version 1.0
 */
@Configuration
public class TomcatConfig {
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory(){
        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(createTomcatConnector());
        return factory;
    }
    private Connector createTomcatConnector(){
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8081);
        return connector;
    }
}

这里首先配置一个 TomcatServletWebServerFactory,然后添加一个 Tomcat 中的 Connect (监听 8080 端口),并将请求转发到 8081 上去。

注意:笔者在实验过程中遇到了一个很常见的问题,在使用 HTTPS 访问页面时报错 

java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.SSL.renegotiatePending(J)I

最后在 StackOverflow 上了解到,只需要将 SpringBoot 的版本改成之前的即可,(2.2.1.RELEASE TO 2.1.0.RELEASE),应该是 Tomcat 的原因,具体参考链接

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值