1、切换JDK
本机当前的JDK是1.8,由于使用HTTP2的话,需要高于JDK1.9的版本,故先切换到JDK11。
首先删除环境变量中的ClassPath
修改JAVA_HOME,指向新的JDK路径
理论上上面两步就OK了,但是在使用Java -version查询版本时仍然显式1.8。排查后发现在Path环境变量中有一个C:\Program Files (x86)\Common Files\Java,该路径下存在java文件,删除该配置后java -version查询正常
2、创建证书
由于HTTP2需要采用TLS连接,需要提供证书,故先创建证书:
D:\>keytool -genkey -alias localhost -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -dname "CN=localhost,OU=gaoxiaoqiang,O=gaoxiaoqiang,L=xa,ST=xa,C=CN"
输入密钥库口令:
再次输入新口令:
这里我将证书放到了D盘根目录。有一些材料介绍的时候让切换到java的路径下,然后执行Keytool创建证书,但在WIN10上,jdk的路径基本都是只读的,所以会提示没有权限写keystore文件。
3、创建Spring Boot项目
使用IDEA创建项目,记得选择新的JDK11版本,依赖如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <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-undertow</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
由于Tomcat不支持HTTP2,所以使用如下配置剔除了TOMCAT:
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
然后添加spring-boot-starter-undertow依赖
4、修改配置文件
由于采用HTTPS,需要修改端口,提供证书,同时打开HTTP2,在properties文件中增加:
#端口号 server.port=8443 #配置ssl (https) server.ssl.key-store=classpath:keystore.p12 server.ssl.key-password=Changeme_123 server.ssl.key-store-password = Changeme_123 #配置ssl (https) end #使用http2 server.http2.enabled=true
并将keystore.p12放到src\main\resources路径下
5、添加Controller
新增一个Contorller,内容如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/log")
public class LogController {
private Logger logger = LoggerFactory.getLogger(LogController.class);
@GetMapping("/info")
public String info() {
logger.info("Info log");
return "info";
}
}
6、验证
运行项目,然后使用Chrome访问:https://localhost:8443/log/info
执行结果应该是:
在Chrome中按F12打开开发者模式,切换到console页签,输入如下内容后回车:
(function(){
// 保证这个方法只在支持loadTimes的chrome浏览器下执行
if(window.chrome && typeof chrome.loadTimes === 'function') {
var loadTimes = window.chrome.loadTimes();
var spdy = loadTimes.wasFetchedViaSpdy;
var info = loadTimes.npnNegotiatedProtocol || loadTimes.connectionInfo;
// 就以 「h2」作为判断标识
if(spdy && /^h2/i.test(info)) {
return console.info('本站点使用了HTTP/2');
}
}
console.warn('本站点没有使用HTTP/2');
})();
按回车执行,执行结果如下,说明的确是采用了HTTP2协议: