继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SpringBoot与容器整合

幕布斯6054654
关注TA
已关注
手记 1258
粉丝 219
获赞 1011

SpringBoot可以嵌入容器从而更好实现微服务,默认支持Tomcat和Jetty的嵌入,只需要在POM文件中导入相应的依赖即可。在有些场景下,我们需要将服务发布到项目早已搭建好的WEB容器中。常见的WEB容器有:

  • Tomcat

  • Jetty

  • Jboss

  • Weblogic

内嵌容器

SpringBoot默认内嵌的容器是Tomcat,当在POM文件中引入spring-boot-starter-web时,会间接引入Tomcat内嵌容器依赖。

webp

spring-boot-starter-web依赖关系


如果要替换成Jetty,则需要在pom.xml引入jetty的包,同时去除tomcat的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions></dependency><dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId></dependency>

另外还要在配置类中配置Jetty容器的管理Bean

@Beanpublic EmbeddedServletContainerFactory servletContainer() {
    JettyEmbeddedServletContainerFactory factory =            new JettyEmbeddedServletContainerFactory();    return factory;
}

外部容器

如果想要在WEB容器(这里以Tomcat作为说明,其他容器类似)中运行,项目的打包类型要为war,同时配置一个maven的war打包插件。

<build>
    <plugins>
        <!-- war打包插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <warName>springboot</warName>
            </configuration>
        </plugin>
    </plugins></build>

我们知道war工程中需要包含web.xml文件,SpringBoot也不例外

webp

web.xml


另外还需要让我们工程的启动类继承SpringBootServletInitializer并重写configure方法,如果不这样做,则项目发布到Tomcat容器中将不会起作用。


@SpringBootApplicationpublic class StartSpringBootMain extends SpringBootServletInitializer{    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {        return builder.sources(StartSpringBootMain.class);
    }    public static void main(String[] args) {
        SpringApplication.run(StartSpringBootMain.class,args);
    }
}

最后执行clean package命令进行打包,将打好的war包放入Tomcat容器中即可。

加入HTTPS

我们通过启用Tomcat中的Https协议来为应用提供https,从而为容器中所有应用提供HTTPS协议。

  1. 首先通过Java自带的工具keytool生成证书,在cmd中执行以下指令(生产上证书要向专业的CA机构申请购买)

keytool -genkey -alias mykey -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -storepass 123456

该指令会在当前用户的目录下生成keystore.p12文件,将该文件拷贝到D盘根路径下。

  1. 修改Tomcat的server.xml文件

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile="D:/keystore.p12" keystorePass="123456"/>

上面的配置默认是关闭的,只要打开即可。同时keystoreFile="D:/keystore.p12" keystorePass="123456"是新增的,依据步骤1的执行传值。
最后启动Tomcat,容器就为我们开启Https协议。

  1. 实现HTTP自动跳转到HTTPS。一般用户输入url时不会带上协议,此时默认走的是HTTP协议,因此我们要实现访问http时能自动跳转到https,要实现这个功能只需要在配置类中加入如下配置。

@Configurationpublic class HttpConnectorConfig { // 此类专门负责HTTP的连接的相关配置
    public Connector initConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http"); // 如果现在用户使用普通的http的方式进行访问
        connector.setPort(8080); // 用户访问的是8080端口
        connector.setSecure(false); // 如果该连接为跳转则表示不是一个新的连接对象
        connector.setRedirectPort(8443); // 设置转发操作端口
        return connector;
    }    @Bean
    public TomcatEmbeddedServletContainerFactory servletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {            @Override
            protected void postProcessContext(
                    org.apache.catalina.Context context) {// 该方法主要进行请求处理的上下文配置
                SecurityConstraint securityConstraint = new SecurityConstraint(); // 定义新的安全访问策略
                securityConstraint.setUserConstraint("CONFIDENTIAL"); // 定义用户的访问约束要求
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*"); // 匹配所有的访问映射路径
                securityConstraint.addCollection(collection); // 追加路径映射访问配置
                context.addConstraint(securityConstraint);
            }

            ;
        };
        factory.addAdditionalTomcatConnectors(this.initConnector());        return factory;
    }
}



作者:Coding小聪
链接:https://www.jianshu.com/p/a82624729a77


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP