SpringBoot与容器整合

作者: Coding小聪 | 来源:发表于2018-04-15 14:31 被阅读107次

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

    • Tomcat
    • Jetty
    • Jboss
    • Weblogic

    内嵌容器

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

    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

    @Bean
    public 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也不例外

    web.xml
    另外还需要让我们工程的启动类继承SpringBootServletInitializer并重写configure方法,如果不这样做,则项目发布到Tomcat容器中将不会起作用。
    @SpringBootApplication
    public 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,要实现这个功能只需要在配置类中加入如下配置。
    @Configuration
    public 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;
        }
    }
    

    相关文章

      网友评论

        本文标题:SpringBoot与容器整合

        本文链接:https://www.haomeiwen.com/subject/idyhhftx.html