SpringBoot可以嵌入容器从而更好实现微服务,默认支持Tomcat和Jetty的嵌入,只需要在POM文件中导入相应的依赖即可。在有些场景下,我们需要将服务发布到项目早已搭建好的WEB容器中。常见的WEB容器有:
- Tomcat
- Jetty
- Jboss
- Weblogic
内嵌容器
SpringBoot默认内嵌的容器是Tomcat,当在POM文件中引入spring-boot-starter-web
时,会间接引入Tomcat内嵌容器依赖。
如果要替换成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也不例外
另外还需要让我们工程的启动类继承
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协议。
- 首先通过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,要实现这个功能只需要在配置类中加入如下配置。
@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;
}
}
网友评论