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
@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也不例外
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协议。
首先通过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盘根路径下。
修改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协议。
实现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